Abstract Factoryパターン

Head First デザインパターンのメモ。

Abstract Factoryパターン

具象クラスを指定することなく、一連の関連オブジェクトや
依存オブジェクトを作成するためのインターフェースを提供する。

Abstract FactoryとFactory Method

多くの場合Abstract FactoryのメソッドはFactory Methodとして実装される。
Abstract Factoryは一連の具象クラスを作成する役割を担うため、その実装にはFactory Methodはうってつけの方法。

  • Abstract Factory

グループをなす一連のクラスを使用したい場合につかう。
Abstract Factoryはオブジェクトコンポジションを利用する。オブジェクト生成をファクトリインターフェースのメソッドに実装する。

  • Factory Method

インスタンス化する必要のある具象クラスからクライアントコードを分離する場合や、必要となるクラスが事前にわからない場合につかう。
Factory Methodは継承を利用する。オブジェクト生成をファクトリメソッドを実装したサブクラスに委譲する。

Abstract Factoryの実装

ピザ店の一連の食材を実装する場合

// 全ての食材を作成するインターフェース
public interface PizzaIngredientFactory {
    public Dough createDough();
    public Sauce createSauce();
    public Cheese createCheese();
}

// ニューヨーク食材ファクトリ
public class NYPizzaIngredientFactory extends PizzaIngredientFactory {
    public Dough createDough() {
        return new ThinCrustDough();
    }

    public Sauce createSauce() {
        return new MarinaraSauce();
    }

    public Sauce createCheese() {
        return new ReggianoCheese();
    }
}


//抽象Pizzaクラスを継承するチーズピザ
public class CheezePizza extends Pizza {
    PizzaIngredientFactory ingredientFactory;

    public CheezePizza(PizzaIngredientFactory ingredientFactory) {
        // 食材ファクトリを格納する
        this.ingredientFactory = ingredientFactory;
    }

    void prepare() {
        // 食材を獲得する
        dough  = ingredientFactory.createDough();
        sauce  = ingredientFactory.createSauce();
        cheese = ingredientFactory.createCheese();
    }
}


Factory Methodパターン