工厂模式、抽象工厂模式
工厂模式、抽象工厂模式
工厂模式:
-
what:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,对象创建过程延迟到子类进行。
-
用相同的行为去根据不同的条件创建不同的实例。适合复杂并且未来有可能扩展的对象。比如一个饭店有好几种披萨,但是披萨的种类还在不断的研发中,就需要扩充披萨这个基类的派生类个数。
日志服务:根据不同的条件需要将日志记录到不同的存储媒介(如本地文件,本地数据库,远程服务器等)中
事件上报:根据不同的渠道(如Trap/SMTP/Syslog/Redfish等)上报事件
数据库连接:根据不同的类型访问不同的数据库(如MemoryDB/LocalDB等)
-
工厂类代码:
Shape* shape_factory::get_shape(string name){ if(name == 'circle'){ return new Circle(); } else if(name == 'rect'){ return new Rect(); } else if(name == 'square'){ return new Square(); } }
可以看到当需要加入新的形状种类时,还需要更改这个工厂代码。这也是违反了CPP设计的某规则。
抽象工厂模式
-
抽象工厂可以认为是工厂的工厂模式
-
可以有不同的产品族,如披萨族,糕点族,饮品族;
-
抽象工厂中,有获取不同族的方法,即获取到某一工厂。而后在工厂内部就是上述的工厂模式:
如抽象工厂:
class AbstractFactory{ public: ShapeFactory* getShapeFactory(){ return new shape_factory(); // 即上一节定义的shape工厂 } ColorFactory* getColorFactory(){ return new color_factory(); } }
-
缺点:扩展性较差,增加产品族需修改抽象工厂代码。
石中之火,即使无可燃烧之物,也要尽力发亮
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)