Factory Method パターン (実際に生成するオブジェクトに依存しない, オブジェクトのインタフェースを提供する)

このパターンでいう [Factory] とは, オブジェクト生産工場のことを言う. つまり, [Factory Method パターン] とは, オブジェクトの生成手順をパターン化したもの.

このパターンを適用すると:

1. オブジェクト作成のための手順 (フレームワーク) を決める役割
2. 実際にオブジェクトを作成する役割

を明確に分けて定義することができる.

役割

  1. Creator (作成者):
[Product] を作成する. オブジェクトの生成手順のみを定義し, 実際の生成については, サブクラス [ConcreteCreator] が行う.
  1. Product (製品):
当パターンで生成されるオブジェクト [ConcreteProduct] のインタフェースを決定する.
  1. ConcreteCreator (具体的な作成者):
具体的な製品を作る.
  1. ConcreteProduct (具体的な製品):
具体的な製品を決定する.
  1. Client (利用者):
[Factory Method] パターンを適用したクラスを利用し処理をする.

クラス図

Factory Method パターンのクラス図

_images/designpattern-factory_method014.gif

ソースコード

  1. Creator.java
1
2
3
4
5
6
7
8
9
public abstract class Creator{

    public abstract Product factoryMethod(); // abstract キーワードが必要

    public final Product create(){ // 抽象クラスの中にメソッドを定義することもできる
	Product product = factoryMethod();
	return product;
    }
}
  1. Product.java
1
2
3
4
public abstract class Product{
    public abstract void method1();
    public abstract void method2();
}
  1. ConcreteCreator.java
1
2
3
4
5
public class ConcreteCreator extends Creator{
    public Product factoryMethod(){
	return new ConcreteProduct();
    }
}
  1. ConcreteProduct.java
1
2
3
4
5
6
7
8
9
public class ConcreteProduct extends Product{
    public void method1(){
	System.out.println("method1");
    }

    public void method2(){
	System.out.println("method2");
    }
}
  1. Clinet.java
1
2
3
4
5
6
7
8
9
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