代碼以水果加工廠的產線為背景
先不談其他,上代碼
工廠類:
class SimpleFactory { public: enum TYPE{ APPLE, BANANA, PEAR }; static SimpleFactory* GetInstance(); ProductionLine *CreateProLine(TYPE type); private: SimpleFactory(); };
SimpleFactory *SimpleFactory::GetInstance() { static SimpleFactory factory; return &factory; } ProductionLine *SimpleFactory::CreateProLine(TYPE type) { ProductionLine* proLine; switch (type) { case APPLE: proLine = new AppleLine(); break; case BANANA: proLine = new BananaLine(); break; case PEAR: proLine = new Pear(); break; } return proLine; }
產線類:
class ProductionLine { public: ProductionLine(); virtual ~ProductionLine(); virtual void Product() = 0; }; class AppleLine: public ProductionLine { public: AppleLine(); ~AppleLine(); virtual void Product(); }; class BananaLine: public ProductionLine { public: BananaLine(); ~BananaLine(); virtual void Product(); }; class Pear: public ProductionLine { public: Pear(); ~Pear(); virtual void Product(); };
void AppleLine::Product() { qDebug() << "product apple!"; }
void BananaLine::Product() { qDebug() << "product banana!"; }
void Pear::Product() { qDebug() << "product pear!"; }
使用:
SimpleFactory* factory = SimpleFactory::GetInstance(); ProductionLine* line1 = factory->CreateProLine(SimpleFactory::APPLE); ProductionLine* line2 = factory->CreateProLine(SimpleFactory::BANANA); ProductionLine* line3 = factory->CreateProLine(SimpleFactory::PEAR); if(line1) line1->Product(); if(line2) line2->Product(); if(line3) line3->Product();
結果:
其實所有的設計模式都是為了對擴展開放,我們來看一下如果增加新的產品線需要修改哪些代碼:
- SimpleFactory工廠類增加枚舉
enum TYPE{ APPLE, BANANA, PEAR, GRAPE };
- 增加Grape類
class Grape: public ProductionLine { public: Grape(); ~Grape(); virtual void Product(); };
- SimpleFactory.CreateProLine 增加case分支
case GRAPE: proLine = new Grape();
- 使用的時候增加創建過程
ProductionLine* line4 = factory->CreateProLine(SimpleFactory::GRAPE); if(line4) line4->Product();
看起來效果還湊合哈,基本做到了對擴展開放,下面給出了各個步驟更通俗的解釋(之后的博客中我也會盡量使用這個代碼跟現實場景和決策映射的方式來闡述代碼這樣寫的原因和好處):
-
工廠類添加枚舉就是廠長下達指令要增加一個Grape(葡萄)的產品線;
-
添加的Grape類就是在工廠騰出了位置給新的Grape產品線;
-
增加case分支就是新的產品線鋪設好了;
-
調用就是用新的產品線開始生產;
git地址:https://gitee.com/guiguzicom/Demo/tree/master/designPatterns/simpleFactory
這個是符合真實場景的模擬的,但是改動的地方還是有點多。沒有做到對修改關閉,那么有沒有更好地辦法呢,關注我的博客,下一篇繼續設計模式探索之旅~