Factory Method Pattern S. Yukita [email protected] Factory Method パターン • クラス階層のどのサブクラスをインスタンス 化するか。その決定をサブクラスに委ねる。 • 付帯的な案件 – インスタンス生成に際して,取り巻く他のオブ ジェクト達との配線が必ず伴うとき,その作業 もインスタンス生成に含めるのがよい。 – constructor に任せるのが酷な場合。 – 配線パターンが定石なら抽象化してしまう。 • 具体的なクラス名はそこでは使わない。 Factory Method 2 例題のクラス図 Factory Creates Product use create [final] createProduct registerProduct framework IDCardFactory Creates IDCard owners owner createProduct registerProduct getOwners use getOwner Factory Method 3 例題の構成 • framework パッケージ – Product.java – Factory.java • idcard パッケージ – IDCard.java – IDCardFactory.java • Main.java Factory Method 4 Product.java package framework; public abstract class Product { public abstract void use(); } Factory Method 5 Factory.java package framework; 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); } Factory Method 6 IDCard.java package idcard; import framework.*; public class IDCard extends Product { private String owner; IDCard(String owner) { System.out.println(owner + "のカードを作ります。"); this.owner = owner; } public void use() { System.out.println(owner + “のカードを使います。”); } public String getOwner() {return owner;} } Factory Method 7 IDCardFactory.java package idcard; import framework.*; import java.util.*; public class IDCardFactory extends Factory { private Vector owners = new Vector(); protected Product createProduct(String owner) { return new IDCard(owner); } protected void registerProduct(Product product) { owners.add(((IDCard)product).getOwner()); } public Vector getOwners() {return owners;} } Factory Method 8 Main.java 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(); } } Factory Method 9 実行結果 結城浩のカードを作ります。 とむらのカードを作ります。 佐藤花子のカードを作ります。 結城浩のカードを使います。 とむらのカードを使います。 佐藤花子のカードを使います。 Factory Method 10 パターン Creator Creates Product method1 method2 method3 create factoryMethod framework ConcreteCreator Creates factoryMethod ConcreteProduct method1 method2 method3 Factory Method 11 例題の解釈 Factory 定型配線パ ターン create [final] createProduct registerProduct override不可 Creates Product use 抽象的 要素的アク ション 具体的 Creates IDCardFactory IDCard owners owner createProduct registerProduct getOwners use getOwner Factory Method 12
© Copyright 2024 ExpyDoc