備忘録

物忘れが酷いので

Abstract Factory

概要

Abstract Factoryは関連するインスタンス群を整合性
もって生成するデザインパターン。例えば、車A、車Bを
作るときに、それぞれのタイヤ、ボディ、エンジンを
正しい組み合わせで整合性を持って組み立てなければならない。
このとき、プラグラマが部品をその時その時に組み合わせて
いたのでは間違いが生じてしまう。Factory Methodパターン
のCreateクラスのようなFactoryクラスを用いてまとめて
生成することで組み合わせを間違いなく整合性を持って
組み立てられる。
・Abstract Factoryクラス
AbstractProductを生成するメソッドのインターフェイスを定義する
・Abstract Productクラス
生成される部品のインターフェイスを定義する。
・Concrete Factoryクラス
Abstract Factoryクラスを実装し、Abstract Product
クラスのサブクラスを生成するメソッドを実装する。
・Concrete Productクラス
Abstract Productクラスを実装する。

Abstract Factoryの実現方法

/* Abstract Productクラス */
interface Tire{}
interface Body{}
interface Engine{}

/* Abstract Factoryクラス */
interface CarFactory{
  public Tire createTire();
  public Body createBody();
  public Engine createEngine();
}

/* Concrete Productクラス */
class TireA implements Tire{}
class TireB implements Tire{}
class BodyA implements Body{}
class BodyB implements Body{}
class EngineA implements Engine{}
class EngineB implements Engine{}

/* Concrete Factoryクラス */
class CarAFactory implements CarFactory{
  public Tire createTire(){
    return new TireA();
  }
  public Body createBody(){
    return new BodyA();
  }
  public Engine createEngine(){
    return new EngineA();
  }
}

/* Concrete Factoryクラス */
class CarBFactory implements CarFactory{
  public Tire createTire(){
    return new TireB();
  }
  public Body createBody(){
    return new BodyB();
  }
  public Engine createEngine(){
    return new EngineB();
  }
}

class Client{
  public void CarManufacturer(CarFactory factory){
    Tire tire = factory.createTire();
    Body body = factory.createBody();
    Engine engine = factory.createEngine();
  }
}

欠点

この例では新しい車を追加するのは容易だが新しい部品、
例えば、ハイブリッド用のバッテリーを搭載するように
するときは変更が容易ではない。