추상 팩토리 패턴은 서로 관련이 있는 객체들을 통째로 묶어 팩토리 클래스로 만들고, 이 팩토리들을 조건에 따라 생성하도록 다시 팩토리를 만들어 객체를 생성하는 패턴
팩토리 패턴은 조건에 따른 객체 생성을 팩토리 클래스로 위임해, 팩토리 클래스에서 객체를 생성하는 패턴으로 추상 팩토리와 차이가 있다.
컴퓨터를 생산하는 공장이 있을 때, 마우스, 키보드, 모니터의 제조사로 삼성사와 엘지사가 있다 했을때,
컴퓨터를 생산할 떄 구성품은 삼성사로 만들거나 전부 엘지사로 만들어야된다.
키보드, 모니터는 삼성사건데, 마우스만 엘지사면 안된다고 가정해보겠다. (물론 될 수도 있지만)
이렇게 컴퓨터는 같은 제조사인 구성품들로 생산되어야하고 ,
다시 말해, 삼성 컴퓨터 객체는 항상 삼성의 마우스 키보드 모니터 객체들로 묶여 생성되어야한다.
즉, 객체를 일관적으로 생산해야한다.
또한 코드 레벨에서 보면, 삼성 컴퓨터인지 엘지 컴퓨터인지 조건에 따라 분기될 것이기 때문에
팩토리 메서드 패턴과 같이, 조건에 따라 객체를 생성하는 부분을 팩토리 클래스로 정의할 것이다.
팩토리 메서드 패턴을 사용해 컴퓨터를 생산하는 로직을 구현해보겠다.
팩토리 메서드 패턴을 사용해 컴퓨터를 생산해보겠다. 그런데 컴퓨터 뿐만 아니라 키보드 마우스 등등 여러 구성품들이 있는데,
위 처럼 팩토리 메서드 패턴을 사용하게 된다면 수많은 팩토리 클래스들이 생기게 된다.
KeyboardFactory keyboardFactory = new KeyboardFactory();
MouseFactory mouseFactory = new MouseFactory();
BodyFactory bodyFactory = new BodyFactory();
MonitorFactory monitorFactory = new MonitorFactory();
SpeakerFactory speakerFactory = new SpeakerFactory();
PrinterFactory printerFactory = new PrinterFactory();
삼성 컴퓨터면 전부 삼성이여야하고 엘지사 컴퓨터면 전부 엘지여야한다. 그래서 일관적으로 객체를 생성하는 작업을 더욱 간결하게 작성할 수 있다.
따라서 추상 팩토리 패턴을 적용해 구성품이 모두 동일한 제조사가 되도록 개선해보겠다.
패턴 적용 전과 비교했을 때 차이점은
- 어떤 제조사의 부품을 선택할지 결정하는 팩토리 클래스가 제거되고 컴퓨터 팩토리 클래스가 추가 되었다
- 삼성 컴퓨터 팩토리와, 엘지 컴퓨터 팩토리는 컴퓨터 팩토리 인터페이스로 캡슐화하고 어떤 제조사의 부품을 생성할 것인지 명확하므로, 각각의 제조사의 부품을 생성합니다.
- FactoryOfComputerFactory 클래스에서 컴퓨터를 생산하는 createComputer() 메서드를 호출합니다.
이상으로 추상 팩토리 패턴이 무엇인지에 대해 알아보았습니다.
정리 하면, 패턴 적용 전 ( 팩토리 메서드 패턴 )에서는 구성품 마다 팩토리를 만들어서 어떤 객체를 형성했는데 그 객체의 구성품은 일정하므로,
추상 팩토리 패턴을 적용하여 관련된 객체들을 한꺼번에 캡슐화 하여 팩토리로 만들어서 일관되게 객체를 생성하도록 했습니다.