オブジェクト指向設計


Factory Method パターン - ファクトリメソッドパターン

2008/06/09 22:44Update
TAGS: Factory Method | GoF | デザインパターン | OOD | オブジェクト指向設計

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言語で説明しています。

上の例から、インスタンスの生成に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だよ
    }
}

有关作者
Syboos.jp編集長AJavaやオープンソース情報の執筆、Webサイトの開発や運営全般の業務に携わる。

Sponsored Link


Comments