Factory Method パターン (実際に生成するオブジェクトに依存しない, オブジェクトのインタフェースを提供する)
このパターンでいう [Factory] とは, オブジェクト生産工場のことを言う. つまり, [Factory Method パターン] とは, オブジェクトの生成手順をパターン化したもの.
このパターンを適用すると:
1. オブジェクト作成のための手順 (フレームワーク) を決める役割
2. 実際にオブジェクトを作成する役割
を明確に分けて定義することができる.
役割
- Creator (作成者):
[Product] を作成する. オブジェクトの生成手順のみを定義し, 実際の生成については, サブクラス [ConcreteCreator] が行う.
- Product (製品):
当パターンで生成されるオブジェクト [ConcreteProduct] のインタフェースを決定する.
- ConcreteCreator (具体的な作成者):
具体的な製品を作る.
- ConcreteProduct (具体的な製品):
具体的な製品を決定する.
- Client (利用者):
[Factory Method] パターンを適用したクラスを利用し処理をする.
クラス図
Factory Method パターンのクラス図
ソースコード
- Creator.java
| public abstract class Creator{
public abstract Product factoryMethod(); // abstract キーワードが必要
public final Product create(){ // 抽象クラスの中にメソッドを定義することもできる
Product product = factoryMethod();
return product;
}
}
|
- Product.java
| public abstract class Product{
public abstract void method1();
public abstract void method2();
}
|
- ConcreteCreator.java
| public class ConcreteCreator extends Creator{
public Product factoryMethod(){
return new ConcreteProduct();
}
}
|
- ConcreteProduct.java
| public class ConcreteProduct extends Product{
public void method1(){
System.out.println("method1");
}
public void method2(){
System.out.println("method2");
}
}
|
- Clinet.java
| public class Client{
public static void main(String[] args){
Creator creator = new ConcreteCreator(); // Creator は抽象クラスなので, Creator() コンストラクタが使えない.
Product product = creator.factoryMethod();
product.method1();
product.method2();
}
}
|
上記のプログラムの実行結果:
[wtopia FactoryMethod]$ java Client
method1
method2