IDCard

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