デザインパターン FactoryMethod:インスタンス作成をサブクラスに任せる
概要
インスタンス作成方法を抽象クラス(フレームワーク側)で規定
具象クラス(具象側で)実処理を行う
本例ではProduct(カードインスタンス)を具象クラスで作成する
抽象クラス側では具象クラスを参照していない為、具象クラス側の変更だけで全体の変更が済む
クラス図
本例
フレームワーク側
Product(製品)
public abstract void use();
}
Creator(作成者)
インスタンス作成方法を規定
実処理はサブクラスに任せる
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(具体的製品)
private String owner;
public IDCard(String owner) {
System.out.println(owner + "様カード作成");
this.owner = owner;
}
@Override
public void use() {
System.out.println(this.owner + "様カード使用");
}
}
ConcreteCreator(具体的作成者)
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 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#様カード使用