23种设计模式C++源码与UML实现--工厂模式
工廠模式
工廠方法模式同樣屬于類的創建型模式,又被稱為多態工廠模式。工廠方法的意義是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類當中。
核心工廠類不在負責產品的創建,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現的接口,這樣進一步抽象化的好處就是使得工廠方法模式可以使系統不再修改具體工廠角色的情況下引進新的產品。
模式中包含的角色極其職責
抽象工廠角色
工廠方法的核心,任何工廠類都必須實現這個接口
具體工廠角色
具體工廠是抽象工廠的一個實現,負責實例化產品對象。
抽象角色
工廠方法模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。
具體產品
工廠方法模式所創建的具體實例對象
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-5uoWJEma-1602171138325)(picture/image-20201008225409185.png)]
工廠模式和簡單工廠模式比較
工廠模式與簡單工廠模式在結構上的不同不是很明顯,工廠方法類的核心是一個抽象工廠類,而簡單工廠模式把核心放在一個具體的類上。
工廠方法模式之所以有一個別名叫多態型工廠模式是因為具體工廠類都是共同的接口或者有共同的抽象父類。
當系統擴展需要添加新的產品對象時,僅僅需要添加一個具體對象以及一個具體工廠對象,原有工廠對象不需要進行任何修改,也不需要修改客戶端,很好的符合了 - 開放封閉-原則。而簡單工廠模式再添加新產品對象后不得不修改工廠方法,擴展性不好。工廠模式退化后可演變成簡單工廠模式。
開放-封閉,通過添加代碼的方式,不是通過修改代碼的方式完成功能的增強
特點 :不需要修改源代碼就可以實現新工能的添加 💛
源碼實現:
#include <iostream> #include <string>using namespace std;// 抽象類中定義子類中需要實現的功能,也就是限定了子類必須實現的一些函數 class Fruit { public:virtual void GetFruit(void) = 0;virtual ~Fruit(void){} };class Banana : public Fruit { public:virtual void GetFruit(void){cout << "I'm banana." << endl;} };class Apple : public Fruit { public:virtual void GetFruit(void){cout << "I'm apple." << endl;} };class AbstructFactory { public:virtual Fruit *CreateProduct(void) = 0;// 這里析構函數使用虛函數的原因是因為,只有父類中析構函數使用虛函數,// 多態時才會從子類析構函數一直調用到基類結束,否則只會調用父類的不會調用子類的析構函數virtual ~AbstructFactory(void){} };class BananaFactory : public AbstructFactory { public:virtual Fruit *CreateProduct(void){return new Banana;} };class AppleFactory : public AbstructFactory { public:virtual Fruit *CreateProduct(void){return new Apple;} };/*** 后期產品擴展*/class Peer : public Fruit { public:virtual void GetFruit(void){cout << "I'm peer." << endl;} };class PeerFactory : public AbstructFactory { public:virtual Fruit *CreateProduct(){return new Peer;}};int main(int argc, char const *argv[]) {AbstructFactory *factory = NULL;Fruit *fruit = NULL;// 制造香蕉factory = new BananaFactory;fruit = factory->CreateProduct();fruit->GetFruit();delete fruit;delete factory;factory = new AppleFactory;fruit = factory->CreateProduct();fruit->GetFruit();delete fruit;delete factory;// 前期系統穩定之后,后期擴展cout << "extern" << endl;factory = new PeerFactory;fruit = factory->CreateProduct();fruit->GetFruit();delete fruit;delete factory;cout << "simple factory test" << endl;return 0; }編譯之后執行結果:
I'm banana. I'm apple. extern I'm peer. simple factory test總結
以上是生活随笔為你收集整理的23种设计模式C++源码与UML实现--工厂模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作者:陈维政,男,北京大学博士生。
- 下一篇: 作者:袁晓如,北京大学“百人计划”研究员