デザインパターン学習メモ:「Factory Method」


このパターンの目的

 オブジェクトを生成するときのインタフェースだけを規定して、実際にどのクラスをインスタンス化するかはサブクラスが決めるようにする。Factory Methodパターンは、インスタンス化をサブクラスに任せる。(GoF本、P.115)

実装例

AbstractShapeFactory.java
// Creator
public abstract class AbstractShapeFactory {
    abstract Shape createCircle();
}
ShapeFactory.java
// ConcreteCreator
public class ShapeFactory extends AbstractShapeFactory {

    @Override
    Shape createCircle() {
        return new Circle();
    }
}
Shape.java
// Product
public interface Shape {
}
Circle.java
// ConcreteProduct
public class Circle implements Shape {
    public Circle() {}
}

利点

Circleクラスの生成をnewすることなくFactoryを通じて行うことができるようになったので、具体的なクラスへの依存を取り除くことができた。

こうして生成されたCircleクラスは、Shapeインタフェースを通して操作されるため、Circleクラスに固有のメソッドを呼ばれることはなくなった。

(備考)生成に関するパターンの使い分け

GoF本では、「Abstract Factory」、「Builder」、「Factory Method」、「Prototype」、「Singleton」の5つが生成に関するパターンとして紹介されている。

どのパターンを用いるかは自分が解決したい課題に応じて変わってくるのはいうまでもないが、「Factory Method」がシンプルで導入しやすいため、まずこれを使ってみるとよい。

GoF本には以下のように書かれている。

 Factory Methodパターンは、しばしば、オブジェクトを生成する標準的な方法として扱われる。(中略)設計の初期段階ではFactory Methodパターンをまず使っておき、より一層の柔軟性が必要であることがわかったときに、他のパターンに発展させるようにする。(P.146)

参考文献

  • エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース(1999)『オブジェクト指向における再利用のためのデザインパターン 改訂版』本位田 真一、吉田 和樹 監訳、SBクリエイティブ
  • ロバート・C・マーチン(2004)『アジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技』瀬谷啓介訳、SBクリエイティブ