工廠模式

工廠模式

工廠模式有一種非常形象的描述,建立對象的類就如一個工廠,而需要被建立的對象就是一個個產品;在工廠中加工產品,使用產品的人,不用在乎產品是如何生產出來的。從軟件開發的角度來說,這樣就有效的降低了模塊之間的耦合。
工程模式具體上分爲三類:

  • 簡單工廠模式
  • 工廠方法模式
  • 抽象工廠模式

簡單工廠模式

簡單工廠模式,它的主要特點是需要在工廠類中做判斷,從而創造相應的產品。當增加新的產品時,就需要修改工廠類。有點抽象,舉個例子就明白了。有一家生產處理器核的廠家,它只有一個工廠,能夠生產兩種型號的處理器核。客戶需要什麼樣的處理器核,一定要顯示地告訴生產工廠。

UML類圖

簡單工廠模式

試用場景:

  • 在程序中,需要創建的對象很多,導致對象的new操作多且雜時,需要使用簡單工廠模式。
  • 由於對象的創建過程是我們不需要去關心的,而我們注重的是對象的實際操作,所以,我們需要分離對象的創建和操作兩部分,如此,方便後期的程序擴展和維護。

侷限性:

若要添加新產品的時候,首先要在產品類型中添加新產品標識,然後還要在工廠類中的的switch()函數,對原代碼的改動量較大,容易產生編碼的錯誤,從本質上不能稱之爲對代碼的擴展。

Code

typedef enum ProductTypeTag
{
    TypeA,
    TypeB,
    TypeC
}PRODUCTTYPE;

class Product
{
public:
    virtual void Show() = 0;
};

class ProductA : public Product
{
public:
    void Show()
    {
        cout<<"I'm ProductA"<<endl;
    }
};

class ProductB : public Product
{
public:
    void Show()
    {
        cout<<"I'm ProductB"<<endl;
    }
};

class ProductC : public Product
{
public:
    void Show()
    {
        cout<<"I'm ProductC"<<endl;
    }
};

// Here is the Factory class
class Factory
{
public:
    Product* CreateProduct(PRODUCTTYPE type)
    {
        switch (type)
        {
        case TypeA:
            return new ProductA();

        case TypeB:
            return new ProductB();

        case TypeC:
            return new ProductC();

        default:
            return NULL;
        }
    }
};

工廠方法模式

工廠方法模式是在簡單工廠模式的基礎上,對“工廠”添加了一個抽象層。將工廠共同的動作抽象出來,作爲抽象類,而具體的行爲由子類本身去實現,讓子類去決定生產什麼樣的產品。

UML類圖:

工廠方法模式

試用場景:

工廠方法模式的意義是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類當中。核心工廠類不再負責產品的創建,這樣核心類成爲一個抽象工廠角色,僅負責具體工廠子類必須實現的接口,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。

  • 在設計的初期,就考慮到產品在後期會進行擴展的情況下,可以使用工廠方法模式。
  • 產品結構較複雜的情況下,可以使用工廠方法模式。
  • 工廠方法模式適用於產品種類結構單一的場合,爲一類產品提供創建的接口。

侷限性

  • 當產品的數量增加,工廠的數量也會變的很多,工廠變得凌亂難以管理。
  • 當工廠需要生成一種全新的產品的時候,由於所有的產品都繼承與Product,此時工廠心有餘而力不足。

Code

class Product
{
public:
    virtual void Show() = 0;
};

class ProductA : public Product
{
public:
    void Show()
    {
        cout<< "I'm ProductA"<<endl;
    }
};

class ProductB : public Product
{
public:
    void Show()
    {
        cout<< "I'm ProductB"<<endl;
    }
};

class Factory
{
public:
    virtual Product *CreateProduct() = 0;
};

class FactoryA : public Factory
{
public:
    Product *CreateProduct()
    {
        return new ProductA ();
    }
};

class FactoryB : public Factory
{
public:
    Product *CreateProduct()
    {
        return new ProductB ();
    }
};

抽象工廠模式

抽象工廠模式,就是工廠方法模式的擴展和延伸,但是抽象工廠模式,更有一般性和代表性;它具有工廠方法具有的優點,也增加了解決實際問題的能力。

UML類圖

這裏寫圖片描述

試用場景

抽象工廠創建的是一系列相關的對象,其中創建的實現其實就是採用的工廠方法模式。在工廠Factory中的每一個方法,就好比是一條生產線,而生產線實際需要生產什麼樣的產品,這是由Factory1和Factory2去決定的,這樣便延遲了具體子類的實例化;同時集中化了生產線的管理,節省了資源的浪費。
而抽象工廠方法適用於產品種類結構多的場合,主要用於創建一組(有多個種類)相關的產品,爲它們提供創建的接口;就是當具有多個抽象角色時,抽象工廠便可以派上用場。

Code

class ProductA
{
public:
    virtual void Show() = 0;
};

class ProductA1 : public ProductA
{
public:
    void Show()
    {
        cout<<"I'm ProductA1"<<endl;
    }
};

class ProductA2 : public ProductA
{
public:
    void Show()
    {
        cout<<"I'm ProductA2"<<endl;
    }
};

// Product B
class ProductB
{
public:
    virtual void Show() = 0;
};

class ProductB1 : public ProductB
{
public:
    void Show()
    {
        cout<<"I'm ProductB1"<<endl;
    }
};

class ProductB2 : public ProductB
{
public:
    void Show()
    {
        cout<<"I'm ProductB2"<<endl;
    }
};

// Factory
class Factory
{
public:
    virtual ProductA *CreateProductA() = 0;
    virtual ProductB *CreateProductB() = 0;
};

class Factory1 : public Factory
{
public:
    ProductA *CreateProductA()
    {
        return new ProductA1();
    }

    ProductB *CreateProductB()
    {
        return new ProductB1();
    }
};

class Factory2 : public Factory
{
    ProductA *CreateProductA()
    {
        return new ProductA2();
    }

    ProductB *CreateProductB()
    {
        return new ProductB2();
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章