2、ファクトリーメソッド(ファクトリーメソッドモード)
ファクトリメソッドパターン:オブジェクトを作成するためのインターフェースを定義し、インスタンス化するクラスをサブクラスに決定させるファクトリメソッドは、クラスのサブクラスへのインスタンス化を遅らせます。
ファクトリー・メソッド・パターンを理解するには、ファクトリー・パターンから始めて、ファクトリー・パターンを3つのカテゴリーに分類できます。
(1)シンプルファクトリーモード(シンプルファクトリー)
(2)ファクトリーメソッド(Factory Method)
(3)抽象ファクトリーモード(抽象ファクトリー)
一部の書籍では、ファクトリーパターンを2つのカテゴリーに分けています。ファクトリーメソッドとアブストラクトファクトリーです。単純なファクトリパターン(Simple Factory)は、ファクトリメソッドパターンの特殊なケースと見なされ、2つは1つのカテゴリに分類されます。
工場がなかった時代に、顧客がBMWを望んだなら、顧客は自分でそれを作るでしょう:
製品カテゴリ:
// BMWX5.java
パブリッククラスBMWX5 {
publicBMWX5(){
System.out.println( "Make a BMW X5");
}
}
// BMWX6.java
パブリッククラスBMWX6 {
publicBMWX6(){
System.out.println( "Make a BMW X6");
}
}
顧客カテゴリ:
// Comsumer.java
パブリッククラスComsumer {
publicstatic void main(String [] args){
BMWX5x5 =新しいBMWX5();
BMWX6x6 =新しいBMWX6();
}
}
その後、産業革命が起こり、顧客が自動車を作るために工場を開設し、工場は彼らが望む種類の自動車を製造することができたので、顧客が自分で自動車を作る必要はありませんでした。
製品カテゴリ:
// BMW.java
パブリック抽象クラスBMW {
publicBMW(){
}
}
// BMWX5.java
パブリッククラスBMWX5はBMWを拡張します{
publicBMWX5(){
System.out.println( "Make a BMW X5");
}
}
// BMWX6.java
パブリッククラスBMWX6はBMWを拡張します{
publicBMWX6(){
System.out.println( "Make a BMW X6");
}
}
工場クラス:
// Factory.java
パブリッククラスファクトリ{
publicstatic BMW createBMW(String type){
if(type == "X5")
returnnew BMWX5();
elseif(type == "X6")
returnnew BMWX6();
elsereturn null;
}
}
顧客カテゴリ:
// Customer.java
パブリッククラスCustomer {
publicstatic void main(String [] args){
Factoryfactory = new Factory();
BMWx5 = factory.createBMW( "X5");
BMWx6 = factory.createBMW( "X6");
}
}
宝马车系列越来越多,如320i、523i、30li等系列,一个工厂已经无法创建所有的宝马车系列。于是又单独分出来多个具体的工厂。每个具体工厂创建一种系列。即具体工厂类只能创建一个具体产品。但是宝马工厂还是个抽象。你需要指定某个具体的工厂才能生产车出来。
产品类:
// BMW.java
public abstract class BMW {
publicBMW(){
}
}
// BMWX5.java
public class BMWX5 extends BMW {
publicBMWX5() {
System.out.println("制造一辆宝马X5");
}
}
// BMWX6.java
public class BMWX6 extends BMW{
publicBMWX6(){
System.out.println("制造一辆宝马X6");
}
}
工厂类:
// FactoryBMW.java
public interface FactoryBMW {
BMWcreateBMW();
}
// FactoryBMWX5.java
public class FactoryBMWX5implements FactoryBMW{
publicBMWX5 createBMW() {
returnnew BMWX5();
}
}
// FactoryBMWX6.java
public class FactoryBMWX6 implements FactoryBMW{
publicBMWX6 createBMW() {
returnnew BMWX6();
}
}
客户类:
// Customer.java
public class Customer {
publicstatic void main(String[] args) {
FactoryBMWX5factoryBMWX5 = new FactoryBMWX5();
BMWX5x5 = factoryBMWX5.createBMW();
FactoryBMWX6factoryBMWX6 = new FactoryBMWX6();
BMWX6x6 = factoryBMWX6.createBMW();
}
}