设计模式(C++) -工厂模式

张开发
2026/6/29 10:25:48 15 分钟阅读
设计模式(C++) -工厂模式
设计模式C) -工厂模式一、设计模式概述设计模式是解决软件设计中常见问题的、可复用的最佳实践方案。它们不是具体代码而是经过验证的、描述问题与解决方案核心思想的模板能提升代码的可维护性、可扩展性和可复用性。二、设计模式三大分类按目的划分1. 创建型模式核心处理对象的创建机制使对象创建更灵活、符合场景。单例模式确保一个类只有一个实例并提供全局访问点。场景数据库连接池、日志管理器。工厂方法模式定义一个创建对象的接口让子类决定实例化哪个类。场景日志记录器文件日志、数据库日志。抽象工厂模式创建相关或依赖对象的家族而不需指定具体类。场景跨平台UI组件Windows按钮/Mac按钮。建造者模式将复杂对象的构建与其表示分离使同样的构建过程可创建不同表示。场景构造复杂的SQL查询、定制化电脑配置。原型模式通过复制现有对象来创建新对象。场景游戏中的怪物复制、成本高的对象初始化。2. 结构型模式核心关注类和对象的组合形成更大的结构。适配器模式使接口不兼容的类能一起工作。场景旧版支付接口接入新系统。装饰器模式动态地为对象添加额外职责。场景Java I/O流、为咖啡添加配料。代理模式为其他对象提供一种代理以控制对这个对象的访问。场景图片懒加载、远程代理、访问控制。外观模式为子系统中的一组接口提供一个统一的高层接口。场景一键启动电脑封装CPU、内存、硬盘的启动。组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。场景文件系统文件与文件夹、菜单树。桥接模式将抽象部分与其实现部分分离使它们可以独立变化。场景不同形状圆、方与不同颜色红、蓝的自由组合。享元模式运用共享技术有效地支持大量细粒度对象。场景文本编辑器中的字符对象池、游戏中的粒子系统。3.行为型模式核心关注对象之间的职责分配与通信。观察者模式定义对象间的一种一对多的依赖关系当一个对象状态改变时所有依赖者都会收到通知。场景事件处理系统、消息订阅。策略模式定义一系列算法封装每个算法并使它们可以互换。场景支付方式选择支付宝、微信、信用卡、导航算法最短路径、最快路径。模板方法模式定义一个操作中的算法骨架将某些步骤延迟到子类中实现。场景冲泡饮料咖啡和茶步骤类似具体实现不同。责任链模式将请求的发送者和接收者解耦使多个对象都有机会处理该请求。场景审批流程经理→总监→CEO、异常处理链。命令模式将请求封装为对象从而支持参数化、队列化、日志化请求。场景GUI的撤销/重做、任务队列。状态模式允许一个对象在其内部状态改变时改变它的行为。场景电梯状态运行、停止、故障、订单状态待支付、已发货、已完成。迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素而又不暴露其内部表示。场景集合类的遍历List、Tree。中介者模式用一个中介对象来封装一系列的对象交互。场景聊天室用户不直接通信通过聊天室中转。访问者模式将算法与对象结构分离在不修改现有对象结构的情况下定义新操作。场景对复杂对象结构如语法树执行多种操作。备忘录模式在不破坏封装性的前提下捕获并外部化一个对象的内部状态以便以后恢复。场景游戏存档、编辑器撤销。解释器模式给定一个语言定义它的文法的一种表示并定义一个解释器。场景SQL解析、正则表达式引擎相对小众用于特定领域语言。三、创建型模式-工厂模式Fatory模式工厂模式在面向对象系统设计中经常可以遇到以下的两类问题我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。这样我们可以通过声明一个指向基类的指针来指向实际的子类实现达到了多态的目的。所以就不得不在要用到子类的地方写new 对象。这样实体类的使用者必须知道实际的子类名称以及会使程序的扩展性和维护变得越来越困难。还有一种情况就是在父类中并不知道具体要实例化哪一个具体的子类。只能在父类中写方法调用具体调用哪一个类的方法交给子类实现。以上两个问题也就引出了 Factory 模式的两个最重要的功能1定义创建对象的接口封装了对象的创建。2使得具体化类的工作延迟到了子类中。四、工厂模式UML类图五、实现代码及调用示例5.1 工厂类实现代码及调用示例classProduct;classFactory{public:virtual~Factory()default;//工厂方法virtualProduct*createProduct()0;};classConcreateFactoryA:publicFactory{public:ConcreateFactoryA()default;virtual~ConcreateFactoryA()default;Product*createProduct()override;};classConcreateFactoryB:publicFactory{public:ConcreateFactoryB()default;virtual~ConcreateFactoryB()default;Product*createProduct()override;};voidtestFactory();//Factory.cpp#includefactory.h#includeproduct.h#includeiostreamusingnamespacestd;Product*ConcreateFactoryA::createProduct(){returnnewConcreateProductA();}Product*ConcreateFactoryB::createProduct(){returnnewConcreateProductB();}voidtestFactory(){coutfactory beginendl;Factory*facnewConcreateFactoryA();Product*proAfac-createProduct();proA-productInfo();if(nullptr!proA){deleteproA;proAnullptr;}if(nullptr!fac){deletefac;facnullptr;}facnewConcreateFactoryB();Product*proBfac-createProduct();proB-productInfo();if(nullptr!proB){deleteproB;proBnullptr;}if(nullptr!fac){deletefac;facnullptr;}coutfactory endendl;}5.2产品类实现代码#pragmaonceclassProduct{public:virtual~Product()default;virtualvoidproductInfo()0;};//产品AclassConcreateProductA:publicProduct{public:ConcreateProductA()default;virtual~ConcreateProductA()default;virtualvoidproductInfo()override;};//产品BclassConcreateProductB:publicProduct{public:ConcreateProductB()default;virtual~ConcreateProductB()default;virtualvoidproductInfo()override;};//product.cc#includeproduct.h#includeiostreamusingnamespacestd;voidConcreateProductA::productInfo(){coutThis is Product Aendl;}voidConcreateProductB::productInfo(){coutThis is Product Bendl;}六、优缺点分析6.1 优点满足以下设计原则对扩展开放对修改关闭依赖倒置避免依赖具体的类尽量依赖抽象。可以避免创建者和具体产品之间的紧密耦合。单一职责原则。将产品创建代码放在程序的单一位置从而使得代码更容易维护。和针对接口编程不要针对实现编程相比较依赖倒置更重注抽象。产品和创建者都要依赖抽象。而倒置指的是具体产品网上依赖。6.2 缺点应用工厂方法模式需要引用许多新的子类代码可能因此会变得更复杂。最好的情况是将该模式引入创建者类的现有层次结构中。

更多文章