Factory Method パターン - ファクトリメソッドパターン
2008/06/09 22:44Update
Factory Method パターンはGoFによる23種類のデザインパターンの一つで、インスタンスの生成方法を提供します。Factory Method パターンでは、親ファクトリクラスはインスタンスの生成のインタフェースを定義し、実際のインスタンスの生成はサブクラスで行います。
はじめに
大規模なシステム開発では、より柔軟性、拡張性があるシステムを構築するために、new を使わずに、「ファクトリ」(Factory)と呼ばれるクラスを使って、インスタンスを生成します。
Factory Methodは、インスタンスの生成をサブクラスに委ねることで、より柔軟なインスタンスの生成ができます。
概要
Factory Methodのクラス図:
◇ 親ファクトリクラス:Creator
◇ サブファクトリクラス:ConcreteCreator
◇ 生成される対象となるクラス:Product、ConcreteProduct
ConcreteCreatorはCreatorから継承します。
ConcreteProductはProductから継承します。
サンプル
次の例から見てみます。
ある企業は、自動車製品を製造しています:
Bus(バス)
Truck(トラック)
BusとTruckはそれぞれの工場によって製造されているとします。
これからはBus、Truck以外の自動車製品も製造の視野に入るかもしれませんので、より柔軟的な製造方法が求めています。
では、Factory Methodで自動車製品の製造を実装して見ます。
次のようなクラスはあると考えられます。
工場(ファクトリ)クラス群:
CarFactory:自動車製品を製造するためのインタフェースを定義します
BusFactory:Busを製造します。
TruckFactory:Truckを製造します。
自動車製品クラス群:
Car:自動車クラス。
CarBus:バス
CarTruck:トラック
工場(ファクトリ)クラスに関連するソース:
CarFactory.java
abstract class CarFactory {
//製造のインタフェースを定義します
public Car createCar();
}
BusFactory.java
class BusFactory extends CarFactory {
public Car createCar() {
//バスを製造します
return new CarBus();
}
}
TruckFactory.java
class TruckFactory extends CarFactory {
public Car createCar() {
//トラックを製造します
return new CarTruck();
}
}
製品関連ソース:
Car.java
public class Car {
public String getType() {
return "Car"; //Carだよ
}
}
CarBus.java
public class CarBus extends Car {
public String getType() {
return "Bus"; //Busだよ
}
}
CarTruck.java
public class CarTruck extends Car {
public String getType() {
return "Truck"; //Truckだよ
}
}
Client:ファクトリでそれぞれの自動車を製造します
Client.java
public class Client {
public static void main(String[] args) {
CarFactory factory = new BusFactory();
//①Carを製造します
Car bus = factory.createCar();
System.out.println("Created:" + bus.getType());
factory = new TruckFactory();
//②Truckを製造します
Car truck = factory.createCar();
System.out.println("Created:" + truck.getType());
}
}
C:\FactoryMethod>javac *.java
C:\FactoryMethod>java Client
Created:Bus
Created:Truck
C:\FactoryMethod>
※Java言語で説明しています。C:\FactoryMethod>java Client
Created:Bus
Created:Truck
C:\FactoryMethod>
上の例から、インスタンスの生成にFactory Methodを使う場合、次のようなメリットがあると考えられます:
①サブクラスは同じインタフェースを持っているため、クライアントはCarFactory.createCar呼ぶだけで、「Busを製造するか、Truckを製造するか」を自由に選択・変更することができます。
②拡張ができる柔軟性に優れたシステムを構築できます。上記の例では、仮にMotorという新しい製品を作ろうとしても、MotorFactoryという製造工場及びCarMotorを追加するだけで、簡単に対応できます。例:
MotorFactory.java
class MotorFactory extends CarFactory {
public Car createCar() {
//モーターを製造します
return new CarMotor();
}
}
CarMotor.java
public class CarMotor extends Car {
public String getType() {
return "Motor"; //Motorだよ
}
}
Sponsored Link
- Relative Articles
- ASP.NETでのフロント・コントローラ(Front Controller)実装 - (2009/10/20 15:22)
- Abstract Factory パターン - 抽象ファクトリパターン - (2008/06/10 13:25)
- Singleton パターン - シングルトンパターン - (2008/06/10 15:36)
- Prototypeパターン - プロトタイプパターン - (2008/06/10 17:23)
- Builderパターン - ビルダーパターン - (2008/06/10 19:01)
- Adapter パターン - アダプターパターン - (2008/06/11 11:30)
- Composite パターン - コンポジットパターン - (2008/06/11 16:59)
- Interpreter パターン - インタプリタパターン - (2008/06/13 15:42)
- Chain of Responsibility パターン - 責任の連鎖パターン - (2008/06/14 00:28)
- Mediator パターン - 仲介者パターン - (2008/06/15 01:40)