FactoryMethodパターン

  1. 概要
     
    1. 問題
      多くの処理は作成する側とそれを利用する側に分けられます。この構造を利用し、作成や利用の詳細が変化しても、mainの処理はそのまま利用できるようにしたい。

       
    2. 手法
      抽象的なFactoryクラスと、抽象的なProductクラスを作成しておきます。Factoryのcreateクラスで作成し、productクラスのuseクラスで利用することにします。createクラスで作成と同時に登録をすれば、登録を忘れることはありません。
       

  2. 例1 Obsserverインターフェース

    1. Factoryクラス
       createメソッドで生産します。具体的な方法は、抽象メソッドcreateProductに任せます。同時に、egisterProduct()で登録も行います。
      public abstract class Factory {
          public final Product create(String owner) {
              Product p = createProduct(owner);
              registerProduct(p);
              return p;
          }
          protected abstract Product createProduct(String owner);
          protected abstract void registerProduct(Product product);
      }

    2. Productクラス
       製品を利用します。実クラスで、useを実装します。

      public abstract class Product {
          public abstract void use();
      }
      
    3. mainクラス
      抽象クラスのcreateとuseメソッドを使用します。各メソッドの実装が変化しても、main()は影響を受けません。IDCradFatoryはProductクラスの実クラスです。
      import framework.*;
      import idcard.*;
      
      public class Main {
          public static void main(String[] args) {
              Factory factory = new IDCardFactory();
              Product card1 = factory.create("結城浩");
              Product card2 = factory.create("とむら");
              Product card3 = factory.create("佐藤花子");
              card1.use();
              card2.use();
              card3.use();
          }
      }