C++设计模式之工厂模式(1)
關(guān)于設(shè)計(jì)模式的作用:
“幫助我們將應(yīng)用組織成容易了解,容易維護(hù),具有彈性的架構(gòu),建立可維護(hù)的OO系統(tǒng),要訣在于隨時(shí)想到系統(tǒng)以后可能需要的變化以及應(yīng)付變化的原則。”
具體可參考:https://www.cnblogs.com/linkstar/p/7859980.html
由于Caffe中的solver產(chǎn)生一系列的solver子類以及建立一系列l(wèi)ayer類時(shí)就用到了工廠模式(參考:https://blog.csdn.net/fangjin_kl/article/details/54019066)。所以這里首先介紹一下第一種設(shè)計(jì)模式-----工廠模式
參考博客:https://blog.csdn.net/wuzhekai1985/article/details/6660462
工廠模式有三種:
(1)簡單工廠模式;
(2)工廠方法模式;
(3)抽象工廠模式;
1、簡單工廠模式
這么描述:現(xiàn)在有一個(gè)工廠Factory類,專門生成核core,現(xiàn)在要生產(chǎn)兩種產(chǎn)品core_A 和 core_B,代碼如下:
enum CTYPE {COREA, COREB}; class SingleCore { public: virtual void Show() = 0; }; //單核A class SingleCoreA: public SingleCore { public: void Show() { cout<<"SingleCore A"<<endl; } }; //單核B class SingleCoreB: public SingleCore { public: void Show() { cout<<"SingleCore B"<<endl; } }; //唯一的工廠,可以生產(chǎn)兩種型號(hào)的處理器核,在內(nèi)部判斷 class Factory { public: SingleCore* CreateSingleCore(enum CTYPE ctype) { if(ctype == COREA) //工廠內(nèi)部判斷 return new SingleCoreA(); //生產(chǎn)核A else if(ctype == COREB) return new SingleCoreB(); //生產(chǎn)核B else return NULL; } };?
當(dāng)然這么做也有一個(gè)缺點(diǎn):當(dāng)Factory要生產(chǎn)一個(gè)新的產(chǎn)品時(shí),就要修改factory類,然而這樣就違背了開放封閉原則,即軟件實(shí)體(類、函數(shù)、模塊)不可修改,只能擴(kuò)展;所以為了通過擴(kuò)展來實(shí)現(xiàn)可以生產(chǎn)新的產(chǎn)品,引入了工廠方法模式;
2、工廠方法模式
這么來描述:通過類的繼承來實(shí)現(xiàn)擴(kuò)展功能,即從父類factory中派生出factory_A類專門用來生產(chǎn)core_A 產(chǎn)品 , 派生出favtory_B類從來生產(chǎn)core_B產(chǎn)品。這樣子如果味蕾要生產(chǎn)新的產(chǎn)品時(shí),只需要派生出新的工廠子類就行了。代碼如下:
class SingleCore { public: virtual void Show() = 0; }; //單核A class SingleCoreA: public SingleCore { public: void Show() { cout<<"SingleCore A"<<endl; } }; //單核B class SingleCoreB: public SingleCore { public: void Show() { cout<<"SingleCore B"<<endl; } }; class Factory { public: virtual SingleCore* CreateSingleCore() = 0; }; //生產(chǎn)A核的工廠 class FactoryA: public Factory { public: SingleCoreA* CreateSingleCore() { return new SingleCoreA; } }; //生產(chǎn)B核的工廠 class FactoryB: public Factory { public: SingleCoreB* CreateSingleCore() { return new SingleCoreB; } };?
當(dāng)然上面這么做也有一個(gè)缺點(diǎn),就是每生產(chǎn)一種新的類別時(shí)就需要建立一個(gè)新的工廠,那么就存在這樣一種情況,依然core_A類,可能我們要對(duì)A生產(chǎn)一系列產(chǎn)品,比如單核的A和多核的A,如果還是用工廠方法模式就太繁瑣了,所以引入了抽象工廠模式;
3、抽象工廠模式
這么描述:它提供了一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無需指定它們具體的類,就是說父類factory只指定要生產(chǎn)單核類和多核類,而不需要指定A、B、C類等等。
代碼如下:
//單核 class SingleCore { public: virtual void Show() = 0; }; class SingleCoreA: public SingleCore { public: void Show() { cout<<"Single Core A"<<endl; } }; class SingleCoreB :public SingleCore { public: void Show() { cout<<"Single Core B"<<endl; } }; //多核 class MultiCore { public: virtual void Show() = 0; }; class MultiCoreA : public MultiCore { public: void Show() { cout<<"Multi Core A"<<endl; } }; class MultiCoreB : public MultiCore { public: void Show() { cout<<"Multi Core B"<<endl; } }; //工廠 class CoreFactory { public: virtual SingleCore* CreateSingleCore() = 0; //只指定要生產(chǎn)單核類和多核類,而不需要指定要生產(chǎn)A還是b類等等virtual MultiCore* CreateMultiCore() = 0; }; //工廠A,專門用來生產(chǎn)A型號(hào)的處理器 class FactoryA :public CoreFactory { public: SingleCore* CreateSingleCore() { return new SingleCoreA(); } MultiCore* CreateMultiCore() { return new MultiCoreA(); } }; //工廠B,專門用來生產(chǎn)B型號(hào)的處理器 class FactoryB : public CoreFactory { public: SingleCore* CreateSingleCore() { return new SingleCoreB(); } MultiCore* CreateMultiCore() { return new MultiCoreB(); } };?
轉(zhuǎn)載于:https://www.cnblogs.com/zf-blog/p/9120628.html
總結(jié)
以上是生活随笔為你收集整理的C++设计模式之工厂模式(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cad墙线打断lisp_CAD墙体如何打
- 下一篇: C++的Memcpy与Memcpy_s函