Factory Method Pattern S. Yukita [email protected].

12
Factory Method Pattern S. Yukita [email protected]

Transcript of Factory Method Pattern S. Yukita [email protected].

Page 1: Factory Method Pattern S. Yukita yukita@k.hosei.ac.jp.

Factory Method Pattern

S. Yukita

[email protected]

Page 2: Factory Method Pattern S. Yukita yukita@k.hosei.ac.jp.

Factory Method 2

Factory Method パターン

• クラス階層のどのサブクラスをインスタンス化するか。その決定をサブクラスに委ねる。

• 付帯的な案件–インスタンス生成に際して,取り巻く他のオブジェクト達との配線が必ず伴うとき,その作業もインスタンス生成に含めるのがよい。

– constructor に任せるのが酷な場合。– 配線パターンが定石なら抽象化してしまう。

• 具体的なクラス名はそこでは使わない。

Page 3: Factory Method Pattern S. Yukita yukita@k.hosei.ac.jp.

Factory Method 3

例題のクラス図Factory

create [final]

createProduct

registerProduct

Product

use

Creates

IDCardFactory

owners

createProduct

registerProduct

getOwners

IDCard

owner

use

getOwner

Creates

framework

Page 4: Factory Method Pattern S. Yukita yukita@k.hosei.ac.jp.

Factory Method 4

例題の構成

• framework パッケージ– Product.java– Factory.java

• idcard パッケージ– IDCard.java– IDCardFactory.java

• Main.java

Page 5: Factory Method Pattern S. Yukita yukita@k.hosei.ac.jp.

Factory Method 5

Product.java

package framework;

public abstract class Product {

public abstract void use();

}

Page 6: Factory Method Pattern S. Yukita yukita@k.hosei.ac.jp.

Factory Method 6

Factory.javapackage 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);

}

Page 7: Factory Method Pattern S. Yukita yukita@k.hosei.ac.jp.

Factory Method 7

IDCard.javapackage 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;}

}

Page 8: Factory Method Pattern S. Yukita yukita@k.hosei.ac.jp.

Factory Method 8

IDCardFactory.javapackage 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;}

}

Page 9: Factory Method Pattern S. Yukita yukita@k.hosei.ac.jp.

Factory Method 9

Main.javaimport 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();

}

}

Page 10: Factory Method Pattern S. Yukita yukita@k.hosei.ac.jp.

Factory Method 10

実行結果

結城浩のカードを作ります。とむらのカードを作ります。佐藤花子のカードを作ります。結城浩のカードを使います。とむらのカードを使います。佐藤花子のカードを使います。

Page 11: Factory Method Pattern S. Yukita yukita@k.hosei.ac.jp.

Factory Method 11

パターンCreator

create

factoryMethod

Product

method1

method2

method3

Creates

ConcreteCreator

factoryMethod

ConcreteProduct

method1

method2

method3

Creates

framework

Page 12: Factory Method Pattern S. Yukita yukita@k.hosei.ac.jp.

Factory Method 12

例題の解釈Factory

create [final]

createProduct

registerProduct

Product

use

Creates

IDCardFactory

owners

createProduct

registerProduct

getOwners

IDCard

owner

use

getOwner

Creates

定型配線パターン

override不可要素的アクション

抽象的

具体的