抽象工廠模式
- 介紹
- 示例
- 示例使用
- 運行結果
- 抽象工廠模式的優缺點
- 優點
- 缺點
- 總結
介紹
抽象工廠模式是一種創建型設計模式,它提供了一種封裝一組相關或相互依賴對象的方式,而無需指定它們具體的類。它允許客戶端使用抽象接口來創建一系列相關的對象,而不必關心其實際的實現細節。
在抽象工廠模式中,存在一個抽象工廠類,該類定義了一組創建對象的方法,這些方法可以創建一系列相關的對象,包括產品對象和工廠對象。由于這些對象都是通過一個抽象接口來創建的,因此它們的具體實現可以被隱藏在實際工廠類的后面。客戶端只需要使用抽象工廠類來創建對象,而無需關心它們的實際實現。(理解這個很重要,就是多態的應用)
通過使用抽象工廠模式,我們可以實現高層模塊的隔離和解耦,從而使系統更加靈活和可擴展。它還具有高度的封裝性,可以隱藏底層實現細節,提高系統的安全性和穩定性。但是它的缺點是增加了系統的復雜性,需要定義更多的抽象類和接口,會增加系統的開發和維護的難度。
示例
這里依舊在之前兩篇工廠模式的基礎之上,進行改進。
這里客戶需要工廠生產塑料的筆筒和鐵制筆筒,另外還想生產塑料劍和鐵制的劍。
下面是示例代碼:
class Sword //劍
{
public:virtual void play() = 0;
};class PlasticSword :public Sword //塑料劍
{
public:void play()override {cout << "塑料劍舞動!!" << endl;}
};class IronSword :public Sword //鐵制劍
{
public:void play()override {cout << "鐵制劍舞動!!" << endl;}
};class AbstractFactory
{
public:virtual PenHolder* createPenHolder() = 0;virtual Sword* createSword() = 0;
};class ProductPlasticFactory :public AbstractFactory
{
public:PenHolder *createPenHolder()override {return new PlasticPenHolder;}Sword* createSword()override {return new PlasticSword;}
};class ProductIronFactory :public AbstractFactory
{
public:PenHolder* createPenHolder()override {return new IronPenHolder;}Sword* createSword()override {return new IronSword;}
};
示例使用
int main()
{AbstractFactory *factory1 = new ProductPlasticFactory;PenHolder*pen_Holder1= factory1->createPenHolder();Sword* sword1 = factory1->createSword();pen_Holder1->introduce();sword1->play();delete factory1;delete pen_Holder1;delete sword1;AbstractFactory *factory2 = new ProductIronFactory;PenHolder* pen_Holder2 = factory2->createPenHolder();Sword* sword2 = factory2->createSword();pen_Holder2->introduce();sword2->play();delete factory2;delete pen_Holder2;delete sword2;return 0;
}
運行結果
抽象工廠模式的優缺點
優點
1.分離接口和實現:客戶端代碼只需要使用抽象工廠和抽象產品,不需要關注具體實現,降低了客戶端與具體實現的耦合度,提高了代碼的可維護性和可擴展性。
2.符合開閉原則:通過增加具體工廠和具體產品的實現,可以增加新的功能和新的產品,而不需要修改代碼。(這里只是針對現有的產品種類而言,隨著新產品的增加,需要修改抽象工廠的接口,繼而也需要修改子工廠的接口,這樣就破壞了開放封閉原則。)
3.保持一致性:抽象工廠模式可以保證一組產品的一致性,使得它們在邏輯上或者物理上都相互配合,滿足一定的約束條件。
缺點
1.增加復雜度:引入抽象工廠和多個抽象產品的層次結構,增加了系統的復雜度,增加了開發難度。
2.不易擴展:一旦增加了一個新的產品族,就需要修改抽象工廠和所有的具體工廠和產品,對系統的維護和擴展帶來了一定的困難。
3.限制產品族內的產品等級結構:由于抽象工廠只定義了一組產品的創建接口,因此它限制了具體產品等級結構的擴展,只能在產品族內擴展產品。
總結
抽象工廠設計模式確實很抽象,所以需要慢慢領悟,多悟幾次,然后再后期的開發中就可以融進自己的項目中,提高程序的封裝性,安全性,但復雜性也隨之增加。