面向對象的可復用設計模式之簡單工廠模式(1/24)

小智雅匯 發佈 2020-01-17T17:07:57+00:00

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

在程序中,需要創建的對象很多,導致對象的new操作多且雜時,需要使用工廠模式;

由於對象的創建過程是我們不需要去關心的,而我們注重的是對象的實際操作,所以,我們需要分離對象的創建和操作兩部分,如此,方便後期的程序擴展和維護。

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

對於工廠模式,具體上可以分為三類:

簡單工廠模式(factory method pattern):實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類(這些產品類繼承自一個父類或接口)的實例。

工廠方法模式(factory method pattern):定義了一個創建對象的接口,但由子類決定要實例化的類是哪一個,工廠方法讓類把實例化推遲到子類。

抽象工廠模式(Abstract factory pattern):提供一個接口, 用於創建相關或依賴對象的家族,而不需要指定具體類。

對於上面的三種工廠模式,從上到下逐步抽象,並且更具一般性。這裡講的是簡單工廠模式。

簡單工廠模式又稱為靜態工廠模式,實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類(這些產品類繼承自一個父類或接口)的實例。

1 簡單工廠模式適用的場合

1.1 工廠類負責創建的對象比較少,由於創建的對象較少,不會造成工廠方法中的業務邏輯太過複雜。

1.2 客戶端只知道傳入工廠類的參數,對於如何創建對象並不關心。

如果客戶端不知道它所需要的對象的類,可以考慮工廠方法模式。

#include <iostream>
#include <vector>
using namespace std;

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

// Here is the product class
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;
        }
    }
};

int main(int argc, char *argv[])
{
    // First, create a factory object
    Factory *ProductFactory = new Factory();
    Product *productObjA = ProductFactory->CreateProduct(TypeA);
    if (productObjA != NULL)
        productObjA->Show();

    Product *productObjB = ProductFactory->CreateProduct(TypeB);
    if (productObjB != NULL)
        productObjB->Show();

    Product *productObjC = ProductFactory->CreateProduct(TypeC);
    if (productObjC != NULL)
        productObjC->Show();

    delete ProductFactory;
    ProductFactory = NULL;

    delete productObjA;
    productObjA = NULL;

    delete productObjB;
    productObjB = NULL;        

    delete productObjC;
    productObjC = NULL;

    return 0;
}

output:

I'm ProductA         
I'm ProductB        
I'm ProductC 

2 簡單工廠模式的優缺點

2.1 優點:

工廠類是整個模式的關鍵。包含了必要的邏輯判斷,根據外界給定的信息,決定究竟應該創建哪個具體類的對象。

通過使用工廠類,外界可以從直接創建具體產品對象的尷尬局面擺脫出來,僅僅需要負責「消費」對象就可以了。

而不必管這些對象究竟如何創建及如何組織的.明確了各自的職責和權利,有利於整個軟體體系結構的優化。

2.2 缺點:

由於工廠類集中了所有實例的創建邏輯,違反了開閉原則,將全部創建邏輯集中到了一個工廠類中;

它所能創建的類只能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了。

當系統中的具體產品類不斷增多時候,可能會出現要求工廠類根據不同條件創建不同實例的需求.

這種對條件的判斷和對具體產品類型的判斷交錯在一起,很難避免模塊功能的蔓延,對系統的維護和擴展非常不利;

開閉原則定義:一個軟體實體如類、模塊和函數應該對擴展開放,對修改關閉。

開放-封閉原則的意思就是說,你設計的時候,時刻要考慮,儘量讓這個類是足夠好,寫好了就不要去修改了,如果新需求來,我們增加一些類就完事了,原來的代碼能不動則不動。這個原則有兩個特性,一個是說「對於擴展是開放的」,另一個是說「對於更改是封閉的」。面對需求,對程序的改動是通過增加新代碼進行的,而不是更改現有的代碼。這就是「開放-封閉原則」的精神所在。

3 總結

創建型模式對類的實例化過程進行了抽象,能夠將對象的創建與對象的使用過程分離。簡單工廠模式又稱為靜態工廠方法模式,它屬於類創建型模式。在簡單工廠模式中,可以根據參數的不同返回不同類的實例。

簡單工廠模式專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。簡單工廠模式包含三個角色:工廠角色負責實現創建所有實例的內部邏輯;抽象產品角色是所創建的所有對象的父類,負責描述所有實例所共有的公共接口;具體產品角色是創建目標,所有創建的對象都充當這個角色的某個具體類的實例。簡單工廠模式的要點在於:當你需要什麼,只需要傳入一個正確的參數,就可以獲取你所需要的對象,而無須知道其創建細節。簡單工廠模式最大的優點在於實現對象的創建和對象的使用分離,將對象的創建交給專門的工廠類負責,但是其最大的缺點在於工廠類不夠靈活,增加新的具體產品需要修改工廠類的判斷邏輯代碼,而且產品較多時,工廠方法代碼將會非常複雜。簡單工廠模式適用情況包括:工廠類負責創建的對象比較少;客戶端只知道傳入工廠類的參數,對於如何創建對象不關心。

ref

https://www.cnblogs.com/ring1992/p/9592569.html

https://www.cnblogs.com/xuwendong/p/9634614.html

-end-

關鍵字: