Abstractory pattern-抽象工場モデル


参考文献:
http://en.wikipedia.org/wiki/Abstract_ファクトリーpattern
    抽象工場モード(英語:Abstractory)はよくある設計モードです.このモデルは一つの製品家族に統一的な作成インターフェースを提供します.この製品家族のあるシリーズが必要な時に、抽象的な工場から相対的なシリーズを選んで、具体的な工場類別を作ることができます.

    二つの製品のインターフェースがあると仮定します.各製品はMacシリーズとWindowsシリーズなど様々なシリーズをサポートしています.このように各シリーズの製品はそれぞれMacButton、WinButton、MacBorder、WinBorderです.運行時刻に一連の製品族を作るために、各シリーズの製品族のためにMacFactoryとWin Factoryを設立することができます.各工場には二つの方法があります.CreateButtonとCreateBorderは対応する製品に戻ります.この二つの方法を一つのインターフェースAbstractoryに抽象化できます.このように運行時間に必要な製品シリーズを作ることができます.

package com.sinosoft.train.gof.cp;

interface GUIFactory {
    public Button createButton();
}
 
 
class WinFactory implements GUIFactory {
    public Button createButton() {
        return new WinButton();
    }
}
 
 
class OSXFactory implements GUIFactory {
    public Button createButton() {
        return new OSXButton();
    }
}

interface Button {
    public void paint();
}
 
 
class WinButton implements Button {
    public void paint() {
        System.out.println("I'm a WinButton");
    }
}
 
 
class OSXButton implements Button {
    public void paint() {
        System.out.println("I'm an OSXButton");
    }
}
 
 
class Application {
    public Application(GUIFactory factory){
        Button button = factory.createButton();
        button.paint();
    }
}
 
public class AbstractFactory {
    public static void main(String[] args) {
        new Application(createOsSpecificFactory());
    }
 
    public static GUIFactory createOsSpecificFactory() {
        int sys = 0;
        if (sys == 1) {
            return new WinFactory();
        } else {
            return new OSXFactory();
        }
    }
}

適用性
以下の状況では、抽象工場モードが使えます.
一つのシステムはその製品の作成、組み合わせ、表示に独立します.
一つのシステムが複数の製品シリーズの一つで構成される場合.
関連する一連の製品のオブジェクトの設計を強調して共同使用する場合.
あなたが製品のクラスを提供する時、それらのインターフェースだけを表示したいです.
長所
具体的な製品は顧客コードから分離されます.
製品のシリーズを変えやすいです.
一つのシリーズの製品族を一つにまとめて作成します.
欠点
製品族の中で新しい製品を拡張するのは難しいです.抽象的な工場のインターフェイスを修正する必要があります.