Creational Pattern 之 Abstract Factory

 
啥時候你想到用Abstract Factory Pattern?
恩 ....
1 當你的系統需要獨立於產品實體的如何被創建、如何被構成、如何被展現的時候,可以考慮使用Abstract Factory Pattern.
2 一個系統需要被配置成不同family的成品, 如界面風格,motif風格、mercury風格。
3 提供一套產品的庫, 需要只對我提供構建產品的接口。
   具體一點,看下面這個實例,一個銷售水果的系統,它不過水果是如何被採摘、如何包裝、如何被封箱、如何貼標籤,而只是將可以賣的成品放到櫃檯或者集市去銷售.
   在這裏, 我們設計銷售水果的系統爲類AutoSaleSystem.

class AutoSaleSystem{
public:
    void saleFruitToJapan() {
        Package* package = new JapanPackage();
        Product* productForSale = package->product();
    }
}

//包裝: 標籤 尺寸 加工工藝(罐頭,乾果,鮮果)等
class Package {
    virtual FruitProduct* produce() const;
}

class JapanPackage : public Package {
    FruitProduct* product() const {
        FruitProduct* product = new JapanFruitProduct (); 
    }    
    
    virtual ~JapanPackage()  {}
}

class RussiaPackage : public Package {
    FruitProduct* product() const {
        FruitProduct* product = new RussiaFruitProduct ();
    }  

    virtual ~ RussiaPackage () {}
}


class FruitProduct {
public:
    virtual   string getLabel() const;
    virtual   unsigned int getSize() const; 
private:
    string m_label;
    unsigned int m_size;
}

class JapanFruitProduct : public FruitProduct {
public:
    string getLabel() const {...}
    unsigned int getSize() const {...}

}

class RussiaFruitProduct : public FruitProduct {
public:
    string getLabel() const {...}
    unsigned int getSize() const {...}
}

Abstract Factory Pattern的利與弊哈:
1 對具體的實現類進行隔離:
    由於由具體的工廠來生產不同的產品,所以不同類型的產品不會混雜在一起。
2 用戶不必瞭解產品的實現細節,而可以只關心接口。
3 在不同的產品族之間切換變得方便:如saleProduct(Package*), 通過爲saleProduct傳遞不同的Package類型可以方便在Japan和Russia倆個產品族直接切換, 接口完全不用改變,改變的僅是在run-time時傳什麼具體的Package類。
4 同時,如果新加一類產品族,需要構建相關的產品類和生產該產品的具體工廠類。

發佈了31 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章