デザインパターン FactoryMethod:インスタンス作成をサブクラスに任せる

概要

インスタンス作成方法を抽象クラス(フレームワーク側)で規定
具象クラス(具象側で)実処理を行う
本例ではProduct(カードインスタンス)を具象クラスで作成する
抽象クラス側では具象クラスを参照していない為、具象クラス側の変更だけで全体の変更が済む

クラス図


本例

フレームワーク側

Product(製品)

public abstract class Product {
 public abstract void use();
}

Creator(作成者)

public abstract class Factory {
 インスタンス作成方法を規定
 実処理はサブクラスに任せる
 public final Product create(String owner) {
  Product p = this.createProduct(owner);
  this.registerProduct(p);
  return p;
 }
 protected abstract Product createProduct(String owner);
 protected abstract void registerProduct(Product p);
}

具象側

ConcreteProduct(具体的製品)

public class IDCard extends Product {

 private String owner;
 public IDCard(String owner) {
  System.out.println(owner + "様カード作成");
  this.owner = owner;
 }

 @Override
 public void use() {
  System.out.println(this.owner + "様カード使用");
 }
}

ConcreteCreator(具体的作成者)

public class IDCardFactory extends Factory {

 private List<IDCard> owners = new ArrayList<IDCard>();

 @Override
 protected Product createProduct(String owner) {
  return new IDCard(owner);
 }

 @Override
 protected void registerProduct(Product p) {
  this.owners.add((IDCard)p);
 }
}

利用

public class Program {

 public static void main(String[] args) {
  Factory f = new IDCardFactory();
  Product card1 = f.create("Java");
  Product card2 = f.create("PHP");
  Product card3 = f.create("C#");

  card1.use();
  card2.use();
  card3.use();
 }
}

結果
Java様カード作成
PHP様カード作成
C#様カード作成
Java様カード使用
PHP様カード使用
C#様カード使用