最近在工作中,有這樣一種情況:對數據進行加密,使用了不同的加密算法,但是加密算法種類固定,不同的初始條件,使用不同的加密算法。對這剛開始還不熟悉,後來才知道設計模式中有對應的處理方法,於是記錄下來,供自己和大家參考。
此處,應該根據不同初始條件實例化不同的加密算法,於是可以想到簡單工廠模式。
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;
}
工廠方法模式,定義一個工廠基類,派生出具體的工廠,去生產具體的產品。此外,符合開放-封閉原則,增加新的加密算法,寫加密功能類,還有派生工廠類即可,而不是修改工廠類。
這就是我對工廠方法模式的一些,目前還太菜,可能理解有誤,如有錯誤之處,請私信我改正。