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