Factory Methodパターン

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

Factory Methodパターン

オブジェクト作成のためのインターフェースを定義するが、
どのクラスをインスタンス化するかについてはサブクラスに決定させる。
Factory Methodにより、クラスはサブクラスにインスタンス化を先送りできる。

Simple Factory

オブジェクト作成をカプセル化するクラスを定義する。
Simple Factory はデザインパターンでなく、プログラミングのイディオム。
Factoryメソッド(スタティックファクトリ)として定義するのも一般的。


Simple Factoryの実装(ピザを作成する場合)

public class SimplePizzaFactory {
    public Pizza createPizza(String type) {
        Pizza pizza = null;

        if (type.equals("チーズ")) {
            pizza = new CheezePizza();
        } else if (type.equals("ペパロニ")) {
            pizza = new PepperoniPizza();
        } else if (type.equals("野菜")) {
            pizza = new VeggiePizza();
        }
        return pizza;
    }
}

Simple FactoryとFactory Methodの違い

Factory Methodでは、サブクラスのメソッドで振舞いを定義する。
実装をサブクラスに決定させるフレームワークを作成する。
Simple Factoryでは、ファクトリは別オブジェクト。
カプセル化する方法は提供するが、作成する具象クラスを変更する方法がない。

Factory Methodの実装

ピザを作成する場合。

// 抽象クラス
public abstract class PizzaStore {
    public Pizza orderPizza(String type) {
        Pizza pizza;
        // ファクトリオブジェクトのメソッドではなく自身のメソッドを呼び出す
        pizza = createPizza(type);
        // ピザの調理処理
        return pizza;
    }

    // 抽象メソッド
    abstract Pizza createPizza(String type);
}

// フランチェイズ店の作成
public class NYPizzaStore extends PizzaStore {
    // createPizzaを実装する
    Pizza createPizza(String type) {
        if (type.equals("チーズ")) {
            return new NYStyleCheezePizza();
        } else if (type.equals("ペパロニ")) {
            return new NYStylePepperoniPizza();
        } else if (type.equals("野菜")) {
            return new NYStyleVeggiePizza();
        } else return null;
    }
}

設計原則

依存性反転の原則

抽象に依存する。具象クラスに依存してはいけない。

  • 具象クラスへの参照を保持する変数を持たない
  • 具象クラスからクラスを継承しない
  • どのベースクラスの実装済みのメソッドもオーバーライドしない


Decoratorパターン