简单工厂模式(c++实现)
代码以水果加工厂的产线为背景
先不谈其他,上代码
工厂类:
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
这个是符合真实场景的模拟的,但是改动的地方还是有点多。没有做到对修改关闭,那么有没有更好地办法呢,关注我的博客,下一篇继续设计模式探索之旅~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
2019-03-13 编译V8过程全纪录