728x90

추상 팩토리 패턴

: 비슷한 속성의 제품(객체)들을 인터페이스로 규격화된 공정(팩토리)에서 일관된 방식으로 생성하고, 생성된 제품끼리는 쉽게 교체될 수 있도로 고안한 패턴

→ 클래스로부터 객체 생성 책임을 분리하는 패턴

 

기본 구조

추상 팩토리 패턴 구조
  1. 추상 팩토리 인터페이스 → 추상 제품을 생성하는 인터페이스 제공
  2. 구현 팩토리 클래스 → 구현된 제품을 생산하는 방법 구현
  3. 추상 제품 인터페이스 → 제품에 대한 추상적 인터페이스 제공
  4. 구현 제품 클래스 → 팩토리가 생성할 구체적인 제품

ex1) UML 클래스 다이어그램
ex2) UML 클래스 다이어그램

# 장점
  - 객체를 분리함으로써 은닉성을 적용한다.
  - 특정 클래스에 의존하지 않는다. 
  - 다른 그룹으로 변경돼도 하위 클래스를 통해 선택적 객체를 다르게 생성할 수 있다.
  - 일부는 인터페이스와 같은 역할을 하여, 코드를 일관적으로 유지하고 실제 구현을 다르게 실행시킬 수 있다.

# 단점
  - 새로운 종류의 군을 추가하는 것이 쉽지 않다.(모든 서브 클래스들이 동시에 변경돼야 하기 때문)
  - 계층의 크기가 커질수록 복잡한 문제가 발생한다.

 

추상 팩토리 패턴팩토리 메소드 패턴의 차이점
→ 팩토리 메소드를 확장한 추상 팩토리
팩토리 패턴과 팩토리 메소드 패턴의 차이는 추상화, 팩토리 메소드 패턴과 추상 팩토리 패턴의 차이는 추상화된 그룹을 형성하고 관리하는 것

- 'abstract factory' 는 생성해야될 각각의 객체마다 하위 클래스(factory)를 생성하여, 원하는 하위 클래스(factory)를 결합하도록 하는 방식이다. (다형성 활용) → 복수의 하위 클래스(factory) 를 갖는 구조
- 'abstract factory' 는 여러 개의 팩토리 메소드를 그룹으로 묶은 것과 유사
- 'abstract factory' 는 복수의 그룹을 관리

- 'factory method' 는 추상화를 통해 하위 클래스에게 구현을 위임하며, 1개의 하위 클래스 안에서 매개 변수를 통해 조건에 따라 각각의 객체를 생성한다. (다형성 배제 방법)
- 'factory method' 는 객체 생성을 담당하는 클래스를 추상화하여 선언과 구현을 분리한 확장 패턴
- 'factory method' 는 단일 그룹 관리

 

팩토리 vs 팩토리 메서드 vs 추상 팩토리 비교


Abstract Factory Pattern example diagram

 

추상 팩토리 패턴은 하나의 팩토리에서 연관된 다양한 제품(Keyboard, Mouse)을 생산할 수 있다.


Abstract Factory Pattern example code

package Pack;

///////////////////////////////////////////////////////////////////////////////////////////////

// 키보드과 마우스 인터페이스 - 키보드와 마우스 연결 필요
interface Keyboard{ void connect_Keyboard(); }
interface Mouse{ void connect_Mouse(); }

// factory는 '공장'이란 뜻이고, 공장은 물건을 만드는 곳이다. 
// factory method 패턴은 상위 클래스에서 객체를 생성하는 인터페이스를 정의하고, 
// 하위 클래스에서 인스턴스를 생성하도록 하는 방식이다.

// Gui 만드는 곳으로, 키보드과 마우스를 생성 필요
interface GuiFactory{
	Keyboard createKeyboard();
	Mouse createMouse();
}

///////////////////////////////////////////////////////////////////////////////////////////////

// 삼성 Gui 만드는 곳은 Gui 만드는 곳의 조언대로 키보드과 마우스 생성을 하라는 말을 들음
class SamsungGuiFactory implements GuiFactory{
	@Override
	public Keyboard createKeyboard() { return new SamsumgKeyboard(); } // 삼성용 키보드 생성
	
	@Override
	public Mouse createMouse() { return new SamsumgMouse(); } // 삼성용 마우스 생성
}

// 아마존 Gui 만드는 곳은 Gui 만드는 곳의 조언대로 키보드과 마우스를 생성을 하라는 말을 들음
class AmazoneGuiFactory implements GuiFactory{
	@Override
	public Keyboard createKeyboard() { return new AmazoneKeyboard(); } // 아마존용 키보드 생성
	
	@Override
	public Mouse createMouse() { return new AmazoneMouse(); } // 아마존용 마우스 생성
}

///////////////////////////////////////////////////////////////////////////////////////////////

// 삼성용 키보드 생성하기 위해 키보드의 조언을 구하여 키보드 연결하라고 지시 받음
class SamsumgKeyboard implements Keyboard{
	@Override
	public void connect_Keyboard() {
		System.out.println("삼성 키보드 연결");
	}
}
// 삼성용 마우스 생성하기 위해 마우스 조언을 구하여 마우스 연결하라고 지시 받음
class SamsumgMouse implements Mouse{
	@Override
	public void connect_Mouse() {
		System.out.println("삼성 마우스 연결");
	}
}

// 아마존용 키보드 생성하기 위해 키보드의 조언을 구하여 키보드 연결하라고 지시 받음
class AmazoneKeyboard implements Keyboard{
	@Override
	public void connect_Keyboard() {
		System.out.println("아마존 키보드 연결");
	}
}
// 아마존용 마우스 생성하기 위해 마우스 조언을 구하여 마우스 연결하라고 지시 받음
class AmazoneMouse implements Mouse{
	@Override
	public void connect_Mouse() {
		System.out.println("아마존 마우스 연결");
	}
}

///////////////////////////////////////////////////////////////////////////////////////////////

public class Hello {
	static void print_factory(GuiFactory factory) {
		Keyboard Keyboard = factory.createKeyboard();
		Mouse Mouse = factory.createMouse();
		
		Keyboard.connect_Keyboard();
		Mouse.connect_Mouse();
	}
	
	public static void main(String[] args) {
		// 삼성 구이 만드는 곳에서 키보드과 마우스를 만듦
		GuiFactory SamsungGuiFactory = new SamsungGuiFactory();
		print_factory(SamsungGuiFactory);
		System.out.println("삼성 컴퓨터 완성");
		
		System.out.println("===============================");
		
		// 아마존 구이 만드는 곳에서 키보드과 마우스를 만듦
		GuiFactory AmazoneGuiFactory = new AmazoneGuiFactory();
		print_factory(AmazoneGuiFactory);
		System.out.println("아마존 컴퓨터 완성");
	}
}

 


# 참고 사이트

- https://ko.wikipedia.org/wiki/%EC%B6%94%EC%83%81_%ED%8C%A9%ED%86%A0%EB%A6%AC_%ED%8C%A8%ED%84%B4

- https://beomseok95.tistory.com/243

- https://spiralmoon.tistory.com/entry/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%B6%94%EC%83%81-%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%8C%A8%ED%84%B4-Abstract-factory-pattern

- https://ocwokocw.tistory.com/87

- https://yeah.tistory.com/13

- 개발자가 반드시 정복해야할 객체 지향과 디자인 패턴 [인투북스, 최범균]

- 쉽게 배워 바로 써먹는 디자인 패턴 [한빛미디어, 이호진]

 

728x90

'IT > Design Pattern' 카테고리의 다른 글

[디자인패턴] 프록시(Proxy)  (0) 2022.06.18
[디자인 패턴] 기본 개념  (0) 2021.10.04
[디자인 패턴] 빌더(Builder)  (0) 2021.10.02

+ Recent posts