-
[Design Pattern] 추상 팩토리(Abstract factory) 패턴CSE/Design Pattern 2015. 6. 13. 10:27
Pattern #4 추상 팩토리 패턴
구체적인 클래스의 명시없이 관련 객체의 패밀리를 생성하기 위한 인터페이스를 제공하기 위하여 사용.
목적
- 객체생성을 추상화하여 이를 사용하는 모듈과 독립적으로 인터페이스를 정의하는데 있다.
- 인스턴스를 생성하기 위한 프레임워크와 실제로 인스턴스를 생성하는 클래스를 분리하여 생각
결과
- 패밀리에 있는 각 클래스의 팩토리 메소드를 가진 클래스에서 패밀리를 생성
동기
당신은 상용 에디터 프로그램의 사용자 인터페이스 부분의 개발을 맡았다. 시장을 넓히기 위하여, 이 프로그램은 MS-Windows GUI환경과 리눅스의 Motif GUI환경을 지원하여야 한다. 하나의 프로그램 소스코드에서 두 가지 GUI를 지원하려면??
123456789101112131415161718/* MS windos GUI */MSWindow *win = new MSWindow;MSScrollbar *scrollbar = new MSScrollbar;MSMenu *menu = new MSMemu;MSMenuItem *i1 = new MSMenuItem;win->addScrollbar(scrollbar);menu->addItem(i1);win->addMenu(menu);/* Linux Motif GUI */MotifWindow *win = new MotifWindow;MotifScrollbar *scrollbar = new MotifScrollbar;MotifMenu *menu = new MotifMemu;MotifMenuItem *i1 = new MotifMenuItem;win->addScrollbar(scrollbar);menu->addItem(i1);win->addMenu(menu);cs 이 두 플랫폼을 Abstract Factory를 통하여 구현하자!
12345678910111213#ifdef MSWINDOWSGUIFactory *factory = new MSFactory;#elifGUIFactory *factory = new MotifFactory;#endWindow *win = factory->createWindow();Scrollbar *scrollbar = factory->createScrollbar();Menu *menu = factory->createMenu();MenuItem *i1 = factory->createMenuItem();win->addScrollbar(scrollbar);menu->addItem(i1);win->addMenu(menu);…cs 의도
구체적인 클래스를 미리 정하지 않고, 상호 관련 있는 객체들의 패밀리(family)를 생성하는 인터페이스를 제공
별칭
Kit
적용
- 시스템이 내부에 사용되는 product들의 생성과 조합에 독립적일 필요가 있을 경우에 사용한다.
- 시스템이 몇 개의 제품 군(product family) 중 하나를 선택하여 환경 설정될 때 사용한다.
- 특정 제품 군이 선택되면, 해당 제품 군 내의 제품(product)들만 사용되도록 강제할 필요가 있을 경우 사용한다.
결과
- 추상성을 높인다. => Client Code에서는 구체적 Product 클래스를 모름
- Product family 교환이 쉽다. => 초기(혹은 실행시)에 ConcreteFactory를 바꿈으로써 원하는 제품군으로 쉽게 교환 가능.
- Product간의 일관성을 증진시킨다. => 사용되는 product들이 같은 factory에서 생성되기 때문에 동일한 product family임이 보장된다.
- 새로운 종류의 product family를 추가하기 쉽다.
- 새로운 종류의 Product 추가는 힘들다.
예제를 통하여 알아보자.
CPU.java
123456package abstractfactory;public interface CPU {public void process();}cs AMDCPU.java
12345678910package abstractfactory;public class AMDCPU implements CPU {public void process() {System.out.println("AMD is processing...");}}cs IntelCPU.java
12345678910package abstractfactory;public class IntelCPU implements CPU {public void process() {System.out.println("Intel is processing...");}}cs CPUFactory.java
1234567package abstractfactory;public interface CPUFactory {public CPU produceCPU();}cs AMDFactory.java
12345678910package abstractfactory;public class AMDFactory implements CPUFactory {public CPU produceCPU() {return new AMDCPU();}}cs IntelFactory.java
12345678910package abstractfactory;public class IntelFactory implements CPUFactory {public CPU produceCPU() {return new IntelCPU();}}cs Computer.java
123456789101112package abstractfactory;public class Computer {private CPU cpu;public Computer(CPUFactory factory) {cpu = factory.produceCPU();cpu.process();}}cs Client.java
12345678910111213141516171819package abstractfactory;public class Client {public static void main(String[] args) {new Computer(createSpecificFactory());}public static CPUFactory createSpecificFactory() {int sys = 0;if (sys == 0) {return new AMDFactory();} else {return new IntelFactory();}}}cs 'CSE > Design Pattern' 카테고리의 다른 글
[Design Pattern] 데코레이터(Decorator) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 파써드(Facade) 패턴 (0) 2015.06.13 [Design Pattern] 빌더(Builder) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 프로토타입(Prototype) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 싱글톤(Singleton) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 팩토리(factory) 패턴 - 디자인 패턴 (0) 2015.06.13