상황
애플리케이션에서 구상 클래스의 인스턴스 생성 부분을 전부 찾아내서 애플리케이션의 나머지 부분으로부터 분리(캡슐화) 하기 위해 팩토리 패턴을 사용함
Pizza orderPizza(String type) { Pizza pizza; /* 변하는 부분 */ if (type.equals("cheese")) { pizza = new CheesePizza(); } else if (type.equals("pepproni")) { pizza = new PepperoniPizza(); } else if (type.equals("clam")) { pizza = new ClamPizza(); } else if (type.equals("veggie")) { pizza = new VeggiePizza(); } /* 변하지 않는 부분 */ pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); return pizza; }
- 변하는 부분인 pizza instance를 만드는 부분을 다른 객체에게 위임함. 그럼으로써 캡슐화를 진행
Simple Factory (간단한 팩토리)
- 간단한 팩토리(Simple Factory)는 디자인 패턴이라기 보다는 프로그래밍에서 자주 쓰이는 관용구에 가까움
Factory Method
팩토리 메서드 패턴 에서는 객체를 생성할 때 필요한 인터페이스를 만듭니다.
어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정합니다.
팩토리 메서드 패턴을 사용하면 클래스 인스턴스 만드는 일을 서브클래스 에게 맡기게 됩니다.
- 모든 팩토리 패턴은 객체 생성을 캡슐화 함
- 팩토리 메소드 패턴은 서브클래스에서 어떤 클래스를 만들지 결정함으로써 객체 생성을 캡슐화함
Simple Factory와 Factory Method 패턴의 차이
- 팩토리 메서드 패턴은 간단한 팩토리와 상당히 비슷함
- 하지만 Simple Factory는 일회용 처방에 불과한 반면, 팩토리 메서드 패턴을 사용하면 여러 번 재사용이 가능한 프레임워크를 만들 수 있음
- 예로, 팩토리 메서드 패턴의 orderPizza() 메서드는 피자를 만드는 일반적인 프레임워크를 제공함
- 그 프레임워크는 팩토리 메서드 피자 생성 구상 클래스(NYPizzaStore, ChicagoPizzaStore)를 만듦
- 둘을 비교해보면 간단한 팩토리는 객체 생성을 캡슐화하는 방법을 사용하긴 하지만 팩토리 메서드만큼 유연하지는 않음. 생성하는 제품을 마음대로 변경할 수 없기 때문에.
팩토리의 장점
- 객체 생성 코드를 전부 한 객체 또는 메서드에 넣으면 코드에서 중복되는 내용을 제거할 수 있고, 나중에 관리할 때도 한 군데에만 신경을 쓰면 됨
- 그리고 객체 인스턴스를 만들 때 인터페이스만 있으면 됨