실제 객체가 정확히 무엇인지 알지 못해도 서로 관련성이 있거나 독립적인 여러 객체를 생성하고 조작할 수 있도록 해준다.
자주 사용하는 Iterator가 Abstract Factory패턴이 적용되었다.
사용처
장점
단점
구현
Abstract Product : Product 관련 인터페이스.
Concreate Product : Abstract Product의 구현 클래스.
Abstract Factory : 각각의 추상 제품을 생성하기 위한 메서드 선언
Concreate Factory : Abstract Factory에 있는 메서드를 구현한다. 각 Concreate Factory는 변형된 제품만 생성한다.
Note : Concreate Factory는 Abstract Product를 반환해야 한다. → 클라이언트가 특정 제품에 연결되지 않고, Concreate Product로 변형시킬 수 있기 때문.
코드
기본이 되는 팩토리가 재료를 공급하고 생산된 Product를 몰라도 Product의 인터페이스를 통해 조작한다.
Abstract Factory
interface Factory{
Timber makeTimber();
Pond makePond();
}
Abstract Product
interface Furniture{
void createFurniture(Factory factory);
void Delivery();
}
Concreate Factory, Concreate Product
public class Main{
public static void main(String[] args) {
// Concreate Factory
Factory chairFactory = new ChairFactory();
Factory sofaFactory = new SofaFactory();
//Concreate Product
Furniture modernChair = new MordernFurniture();
modernChair.createFurniture(chairFactory);//모던 의자를 만든다.
Furniture victorianSofa = new VictorianFurniture();
victorianSofa.createFurniture(sofaFactory);//빅토리안 소파를 만든다.
ChairFactory는 의자를 만들기 위한 나무와 못을 제공한다.
SofaFactory는 소파를 만들기 위한 나무와 못을 제공한다.
createFurniture는 가구를 만든다.
Abstract Factory는 Factory method와 혼합하여 사용하기도 한다.
디자인 패턴을 너무 딱딱하게 생각하지 말고 원하는 부분은 변경하여 사용해도 된다.
ConcreateFactory는 싱글톤으로 만드는게 좋다.