설명
Abstract Factory 패턴은 생성 패턴으로 어떤 object(eg. 클래식 가구) 대해 그 object와 관련된 것들(
A family of related products
ex. 클래식 의자, 클래식 책상, 클래식 커피책상 ...)을 구체 클래스를 통하지 않고 다 만들어낼 수 있게 해주는 패턴임Factory 를 찍어내는 Factory다.
상황
- Chair + Sofa + CoffeeTable = A family of related products 라고 할 때
- 해당하는 family of related products를 다양한 버전으로 만들고 싶은 상황. 예를 들어 Modern한, Victorain, ArtDeco 버전의 제품들
- 이 때, 같은 버전으로 매칭 해서 Chair , Sofa, CoffeeTable을 사야 하는 필요성이 있는 것임. 하나만 다르면 이상하니까
- 그리고, 새로운 제품(eg. Bed)을 추가하거나 새로운 버전(Classic)을 추가할 때 코드의 수정이 있으면 안됨
해결책
- 제일 처음 할 것은, Family of related products(Chair, Sofa, CoffeeTable)등에 대해 interface를 만드는 것

- 그다음 Abstract Factory를 구성하는 것(모든 product -
Chair, Sofa, CoffeeTable
를 만드는 메소드를 포함한 ⇒FurnitureFactory
) createChair()
,createCoffeeTable()
,createSofa()
각각은 interface를 반환하도록 구현하기
- 각 버전별 Factory를 구현하기(
VictorainFurnitureFactory, ModernFurnitureFactory
)
- 그러므로, Client code에서는
FurnitureFactory
와Chair
,Sofa
,CoffeeTable
interface만을 가지고 객체들을 만들어낼 수 있음

코드
Factory
public interface FurnitureFactory { Chair createChair(); void createCoffeeTable(); void createSofa(); } public class ModernFurnitureFactory implements FurnitureFactory{ @Override public Chair createChair() { return new ModernChair(); } @Override public void createCoffeeTable() { } @Override public void createSofa() { } } //...
Client
public static void main(String[] args) { makeChairAndSit(FactoryType.Modern); makeChairAndSit(FactoryType.Victorian); } public static void makeChairAndSit(FactoryType type){ if(type == FactoryType.Modern){ FurnitureFactory factory = new ModernFurnitureFactory(); factory.createChair().sitOn(); } else if(type == FactoryType.Victorian){ FurnitureFactory factory = new VictorianFurnitureFactory(); factory.createChair().sitOn(); } }
개인적 견해
- Abstract Factory는 Factory와는 다른점이 Factory에서는 하나의 종(eg : 운송수단 → 배, 차, ...)에 대해서 여러 가지 버전으로 생성해 낼 때 쓰이지만, Abstract Factory 패턴은 여러가지 종(의자 → 모던의자, 클래식의자.., 책상 → 모던책상, 클래식 책상..., 소파 → 모던소파, 클래식 소파)에 대해서 생성해 낼 때 쓰이게 됨
- Factory 패턴 보다 조금 더 추상화 하여 사용함
- 그 이유는 Factory 패턴은 1차원, Abstract Factory는 2차원 이라서 한 차원 더 추상화 시켰다고 생각하면 됨
- Factory는 하나의 종에 대해서 만 확장을 하는데 반해, Abstract Factory는 여러 종으로 확장을 해야 하고(FurnitureFactory → ModernFurnitureFactory, VictorianFurniture...) 그 종 안에서 또 위의 Factory 패턴이 적용 되는 것