神奇的設計模式之工廠方法模式

最近在工作中,有這樣一種情況:對數據進行加密,使用了不同的加密算法,但是加密算法種類固定,不同的初始條件,使用不同的加密算法。對這剛開始還不熟悉,後來才知道設計模式中有對應的處理方法,於是記錄下來,供自己和大家參考。
此處,應該根據不同初始條件實例化不同的加密算法,於是可以想到簡單工廠模式。
1.簡單工廠模式
加密基類:可以派生出具體的加密類。
工廠類:工廠類中根據初始的條件,生成不同加密類的實例並返回基類指針[多態性嘛!不用多說了]。
工廠類依賴不同加密類,至於多出工廠類這個類,主要解除客戶和具體的加密算法之間的依賴。
代碼如下:

//定義加密基類
class EncryptBase
{
public:
    EncryptBase() {}
    virtual void Print() {}
    virtual ~EncryptBase() {}
};
class AESEncrypt :public EncryptBase
{
public:
    AESEncrypt() {}
    void Print() { std::cout << "This is aes!\n"; }
    virtual ~AESEncrypt() {}
};
class DESEncrypt :public EncryptBase
{
public:
    DESEncrypt() {}
    void Print() { std::cout << "This is des!\n"; }
    virtual ~DESEncrypt() {}
};
//工廠類,給定條件,實例化不同對象
class EncryptFactory
{
public:
    EncryptFactory() {}
    EncryptBase* createEncryptMethod(int iValue);
    virtual ~EncryptFactory() {}
};
EncryptBase* EncryptFactory::createEncryptMethod(int iValue)
{
    switch (iValue)
    {
    case 1:
        return new AESEncrypt();
        break;
    case 2:
        return new DESEncrypt();
        break;
    default:
        return NULL;
        break;
    }
}
int main()
{
    EncryptFactory  fac;
    EncryptBase* ebPtr = fac.createEncryptMethod(1);
    ebPtr->Print();
    system("pause");
    return 0;
}

簡單工廠就是這樣,是不是很簡單,哈哈。如果有新的加密算法添加進來,只需要在派生一個加密類,同時修改工廠裏邊的分支判斷條件即可。而這,恰恰就是簡單工廠的弊端,修改工廠類,違背了一個原則:開放封閉原則。


開放封閉原則
簡單說就是對擴展開放,對修改封閉。


那爲什麼我還使用簡單工廠模式,因爲我的加密算法種類是確定,就是不考慮擴展了,於是我偷懶就用了簡單工廠模式。假如考慮擴展性,我的重新改進了,就是二十三種設計模式中的——工廠方法模式。
2.工廠方法模式
簡單工廠在工廠類中邏輯判斷實例化哪一個加密類,能不能把這個內部邏輯判斷,挪出來,在客戶端進行判斷。
工廠方法模式:定義一個用於創建對象的接口,讓子類決定實例化哪一個類。[程傑《大話設計模式》]
代碼如下,僅修改了工廠類:

class EncryptFactoryBase
{
public:
    EncryptFactoryBase() {};
    EncryptBase* createEncryptMethod() {};
    virtual ~EncryptFactoryBase() {};
};
class AESEncryptFactory:public EncryptFactoryBase
{
public:
    AESEncryptFactory() {};
    EncryptBase* createEncryptMethod()
    {
        return new AESEncrypt();
    }
    virtual ~AESEncryptFactory() {};
};
class DESEncryptFactory :public EncryptFactoryBase
{
public:
    DESEncryptFactory() {};
    EncryptBase* createEncryptMethod()
    {
        return new DESEncrypt();
    }
    virtual ~DESEncryptFactory() {};
};
int main()
{
    AESEncryptFactory  aesFac;
    EncryptBase* ebPtr = aesFac.createEncryptMethod();
    ebPtr->Print();
    DESEncryptFactory  desFac;
    EncryptBase* ebPtr1 = desFac.createEncryptMethod();
    ebPtr1->Print();
    system("pause");
    return 0;
}

工廠方法模式,定義一個工廠基類,派生出具體的工廠,去生產具體的產品。此外,符合開放-封閉原則,增加新的加密算法,寫加密功能類,還有派生工廠類即可,而不是修改工廠類。
這就是我對工廠方法模式的一些,目前還太菜,可能理解有誤,如有錯誤之處,請私信我改正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章