【c++設計模式05】創建型3:抽象工廠模式(Abstact Factory Pattern)
- 一、工廠模式
- 二、抽象工廠模式
- 三、UML類圖
- 四、demo
- 五、總結
原創作者:鄭同學的筆記
原創地址:https://zhengjunxue.blog.csdn.net/article/details/132306496
qq技術交流群:921273910
類型 | 序號 | 設計模式 | 描述 |
創建型 | 1 | 簡單工廠模式 (Simple Factory Pattern) | 通過一個工廠類負責創建所有產品的實例 |
2 | 工廠方法模式 (Factory Pattern) | 將對象的實例化延遲到子類中實現 | |
3 | 抽象工廠模式 (Abstact Factory Pattern) | 通過提供一組相關產品的接口,實現了一系列具體工廠類來創建不同產品族的實例 | |
4 | 單例模式 (Singleton Pattern) | 保證一個類只有一個實例 | |
5 | 創建者模式 (Builder Pattern) | 如何創建一個組合對象 | |
6 | 原型模式 (Prototype Pattern) | 它通過復制已有對象來創建新的實例 |
一、工廠模式
-
工廠模式是一種軟件設計模式,它提供了一種創建對象的方式,將對象的實例化和使用分離開來。工廠模式通過定義一個公共的接口或抽象類來創建對象,并由實現該接口或繼承該抽象類的具體工廠類負責實例化對象。
-
在工廠模式中,客戶端通過調用工廠類的方法來獲取所需的對象,而無需直接實例化對象。工廠類根據不同的需求條件,使用不同的邏輯或算法創建相應的對象,隱藏了對象創建的具體細節。
-
工廠模式可以有效地降低系統的耦合度,提高代碼的可維護性和可擴展性。它符合面向對象設計原則中的開放封閉原則,即對擴展開放,對修改封閉。當需要新增一種產品時,只需添加相應的具體產品類和對應的工廠類,而無需修改已有的代碼。
-
常見的工廠模式包括簡單工廠模式、工廠方法模式和抽象工廠模式。
簡單工廠模式通過一個工廠類負責創建所有產品的實例;
工廠方法模式將對象的實例化延遲到子類中實現;
抽象工廠模式通過提供一組相關產品的接口,實現了一系列具體工廠類來創建不同產品族的實例。
二、抽象工廠模式
工廠模式里面,只有蘋果、香蕉,實際情況可能更加的復雜,比如蘋果也有不同的國家生成的,比如
水果\國家 | 中國 | 美國 |
---|---|---|
蘋果 | 中國蘋果 | 美國蘋果 |
香蕉 | 中國香蕉 | 美國香蕉 |
在抽象工廠模式中,除了有產品的抽象類(Apple和Banana),還有一個抽象的工廠類(Factory)。工廠類定義了一個或多個用于創建不同類別產品的純虛函數,其中每個純虛函數對應一個具體的產品。在這段代碼中,Factory類中的createApple()和createBanana()函數就是抽象工廠方法。
然后通過具體的工廠類(ChinaFactory和USAFactory)繼承抽象工廠類,并實現了抽象工廠類中的純虛函數,這些具體的工廠類分別負責創建中國水果和美國水果的對象。
抽象工廠模式的優點是可以確保客戶端只能訪問抽象接口,而不用擔心具體的產品類。它提供了一種靈活的方式來創建相關的產品族,且易于替換不同的具體工廠類。缺點是當需要添加新的產品類時,需要修改抽象工廠和所有的具體工廠類,違反了開閉原則。
總結來說,抽象工廠模式是一種創建一族相關對象的設計模式,通過定義抽象的工廠類和產品類,以及具體的工廠類的組合,實現了對象的創建與客戶端的解耦。這種模式在需要創建一系列相關對象時非常有用,可以根據不同的具體工廠類來創建不同產品族的對象。
三、UML類圖
- 當然,蘋果和香蕉也可以同時繼承一個水果類,但是我們這里用不到,就不畫了。
- 抽象工廠模式AbstractFactory 模式就是用來解決這類問題的:要創建一組相關或者相互依賴的對象。
四、demo
#include<iostream>
using namespace std;class Apple {
public:virtual void say() {};virtual ~Apple() {};
};
class Banana {
public:virtual void say() {};virtual ~Banana() {};
};
class ChinaApple : public Apple {
public:void say() override{cout << "i am a China Apple\n";}
};
class ChinaBanana : public Banana {
public:void say(){cout << "i am a china Banana\n";}
};class USAApple : public Apple {
public:void say() override{cout << "i am a USA Apple\n";}
};
class USABanana : public Banana {
public:void say(){cout << "i am a USA Banana\n";}
};class Factory {
public:virtual Apple* createApple() = 0;virtual Banana* createBanana() = 0;virtual ~Factory() {};
};class USAFactory:public Factory {
public:Apple* createApple() override{return new USAApple;}Banana* createBanana() override {return new USABanana;}
};class ChinaFactory :public Factory {
public:Apple* createApple() override {return new ChinaApple;}Banana* createBanana() override {return new ChinaBanana;}
};int main()
{Factory* factory = new ChinaFactory();Apple* obj = factory->createApple();obj->say();factory = new USAFactory();Banana* obj2 = factory->createBanana();obj2->say();return 0;
}
輸出
五、總結
AbstractFactory 模式和 Factory模式的區別是初學(使用)設計模式時候的一個容易引起困惑的地方。實際上,AbstractFactory模式是為創建一組(有多類)相關或依賴的對象提供創建接口,而 Factory模式是為一類對象提供創建接口或延遲對象的創建到子類中實現。并且可以看到,AbstractFactory模式通常都是使用 Factory 模式實現。