工厂模式C整合菜鸟教程Python工厂模式与公众号C工厂模式核心内容全部采用C11标准编写所有代码可直接编译运行系统讲解工厂模式的原理、实现、应用及工程实践帮助快速掌握三种核心工厂模式的使用场景与最佳实践。一、工厂模式核心概述工厂模式是创建型设计模式核心思想是将对象的创建过程封装起来由专门的工厂类统一负责对象实例化客户端仅通过工厂接口获取对象无需直接使用new关键字或依赖具体类。核心价值解耦客户端与具体产品类分离无需关注对象创建细节易扩展新增产品时尽可能减少对原有代码的修改统一管理对象创建逻辑集中便于维护和复用符合设计原则优先满足单一职责、开闭原则对扩展开放对修改关闭解决的核心问题直接使用new创建对象导致的代码耦合度高、维护困难、违反开闭原则等问题如大量if-else判断对象类型新增类需修改多处代码。二、工厂模式三种类型2.1 简单工厂模式Simple Factory原理由一个工厂类通过接收参数如字符串、枚举通过if-else判断创建不同类型的具体产品。是最基础、最简单的工厂模式本质是“一个工厂管所有产品”。适用场景产品种类少、结构稳定不频繁扩展如仅需创建2-3种固定类型对象。C 完整可编译代码#includeiostream#includestringusingnamespacestd;// 抽象产品水果统一接口classFruit{public:virtualvoidshow()0;// 纯虚函数定义统一行为virtual~Fruit(){}// 虚析构函数避免内存泄漏};// 具体产品1苹果实现抽象产品接口classApple:publicFruit{public:voidshow()override{cout创建苹果对象endl;}};// 具体产品2香蕉实现抽象产品接口classBanana:publicFruit{public:voidshow()override{cout创建香蕉对象endl;}};// 简单工厂类负责创建所有具体产品classSimpleFactory{public:// 静态工厂方法通过参数判断创建哪种产品staticFruit*createFruit(string type){if(typeapple){returnnewApple();}elseif(typebanana){returnnewBanana();}// 未知类型返回空指针returnnullptr;}};// 客户端测试代码intmain(){// 通过工厂创建苹果对象Fruit*f1SimpleFactory::createFruit(apple);if(f1)f1-show();// 避免空指针调用// 通过工厂创建香蕉对象Fruit*f2SimpleFactory::createFruit(banana);if(f2)f2-show();// 释放内存避免内存泄漏deletef1;deletef2;return0;}优缺点优点结构简单、代码简洁创建逻辑集中管理客户端与具体产品解耦。缺点新增产品时必须修改工厂类的if-else判断违反开闭原则工厂类职责过重不符合单一职责原则。2.2 工厂方法模式Factory Method原理针对简单工厂模式的缺陷优化定义抽象工厂接口仅声明创建产品的方法为每个具体产品单独创建一个具体工厂类继承抽象工厂由具体工厂类负责创建对应的具体产品。核心改进新增产品时无需修改原有工厂代码只需新增“具体产品类对应具体工厂类”完全符合开闭原则。适用场景单一产品族需要频繁扩展产品类型如路径规划器、日志记录器等可能不断新增类型。C 完整可编译代码#includeiostreamusingnamespacestd;// 抽象产品水果统一接口classFruit{public:virtualvoidshow()0;virtual~Fruit(){}};// 具体产品1苹果classApple:publicFruit{public:voidshow()override{cout工厂方法创建苹果endl;}};// 具体产品2香蕉classBanana:publicFruit{public:voidshow()override{cout工厂方法创建香蕉endl;}};// 抽象工厂声明创建产品的纯虚方法仅定义接口不实现classFactory{public:virtualFruit*createFruit()0;virtual~Factory(){}};// 具体工厂1苹果工厂仅负责创建苹果对象classAppleFactory:publicFactory{public:Fruit*createFruit()override{returnnewApple();}};// 具体工厂2香蕉工厂仅负责创建香蕉对象classBananaFactory:publicFactory{public:Fruit*createFruit()override{returnnewBanana();}};// 客户端测试代码intmain(){// 1. 创建苹果工厂再通过工厂创建苹果Factory*factorynewAppleFactory();Fruit*fruitfactory-createFruit();fruit-show();// 释放资源deletefruit;deletefactory;// 2. 创建香蕉工厂再通过工厂创建香蕉factorynewBananaFactory();fruitfactory-createFruit();fruit-show();// 释放资源deletefruit;deletefactory;return0;}优缺点优点严格遵循开闭原则新增产品仅需新增产品类和工厂类工厂职责单一符合单一职责原则客户端仅依赖抽象接口解耦更彻底。缺点产品数量增多时会导致工厂类数量爆炸一个产品对应一个工厂增加系统复杂度。2.3 抽象工厂模式Abstract Factory原理适用于“多产品族、多产品等级”的场景抽象工厂定义一个接口用于创建一组相关或相互依赖的产品如“手机路由器”属于一个产品族小米和华为各有自己的产品族。核心特点一个具体工厂可以创建多个关联的产品保证同一产品族内的产品兼容性。适用场景需要创建多组关联产品且产品族相对固定如跨平台GUI组件、电子设备产品族等。C 完整可编译代码#includeiostreamusingnamespacestd;// 产品A抽象手机统一接口classPhone{public:virtualvoidcall()0;// 手机的核心行为通话virtual~Phone(){}};// 产品B抽象路由器统一接口classRouter{public:virtualvoidwifi()0;// 路由器的核心行为提供WiFivirtual~Router(){}};// 小米产品族产品A1 产品B1classMiPhone:publicPhone{public:voidcall()override{cout小米手机 通话endl;}};classMiRouter:publicRouter{public:voidwifi()override{cout小米路由器 提供WiFiendl;}};// 华为产品族产品A2 产品B2classHuaweiPhone:publicPhone{public:voidcall()override{cout华为手机 通话endl;}};classHuaweiRouter:publicRouter{public:voidwifi()override{cout华为路由器 提供WiFiendl;}};// 抽象工厂定义创建一组关联产品的接口classAbstractFactory{public:virtualPhone*createPhone()0;// 创建手机virtualRouter*createRouter()0;// 创建路由器virtual~AbstractFactory(){}};// 具体工厂1小米工厂创建小米产品族classMiFactory:publicAbstractFactory{public:Phone*createPhone()override{returnnewMiPhone();}Router*createRouter()override{returnnewMiRouter();}};// 具体工厂2华为工厂创建华为产品族classHuaweiFactory:publicAbstractFactory{public:Phone*createPhone()override{returnnewHuaweiPhone();}Router*createRouter()override{returnnewHuaweiRouter();}};// 客户端测试代码intmain(){// 1. 创建小米工厂获取小米产品族AbstractFactory*factorynewMiFactory();Phone*phonefactory-createPhone();Router*routerfactory-createRouter();phone-call();router-wifi();// 释放资源deletephone;deleterouter;deletefactory;// 2. 创建华为工厂获取华为产品族factorynewHuaweiFactory();phonefactory-createPhone();routerfactory-createRouter();phone-call();router-wifi();// 释放资源deletephone;deleterouter;deletefactory;return0;}优缺点优点保证同一产品族内的产品兼容性新增产品族时只需新增具体产品和具体工厂符合开闭原则集中管理关联产品的创建逻辑。缺点结构复杂理解成本高新增产品等级如在“手机路由器”基础上新增“耳机”时需要修改抽象工厂接口及所有具体工厂改动成本大。三、工程进阶注册式工厂大型项目推荐原理在大型C项目如机器人系统、插件系统中更常用注册式工厂。核心思想产品类在初始化时自动注册到工厂中通过键值映射如字符串对应产品创建函数创建对象无需修改工厂代码支持插件化扩展。C 完整可编译代码#includeiostream#includememory#includeunordered_map#includefunctional#includestringusingnamespacestd;// 抽象产品路径规划器classPlanner{public:virtualvoidplan()0;virtual~Planner()default;};// 注册式工厂单例模式 键值映射classPlannerFactory{public:// 定义创建产品的函数类型工厂方法usingCreatorfunctionunique_ptrPlanner();// 单例模式保证工厂只有一个实例staticPlannerFactoryinstance(){staticPlannerFactory factory;returnfactory;}// 注册产品将产品名称与创建函数绑定voidregisterPlanner(conststringname,Creator creator){creators_[name]creator;}// 创建产品根据名称获取创建函数生成产品对象unique_ptrPlannercreate(conststringname){if(creators_.count(name)){returncreators_[name]();}returnnullptr;// 未知类型返回空指针}private:PlannerFactory()default;// 私有构造防止外部创建实例unordered_mapstring,Creatorcreators_;// 存储产品名称与创建函数的映射};// 具体产品1AStar路径规划器 自动注册classAStarPlanner:publicPlanner{public:voidplan()override{coutAStar planning...endl;}private:staticboolregistered_;// 标记是否已注册};// 静态注册程序启动时自动注册产品boolAStarPlanner::registered_[](){PlannerFactory::instance().registerPlanner(astar,[](){returnmake_uniqueAStarPlanner();}// 匿名函数创建AStarPlanner对象);returntrue;}();// 具体产品2RRT路径规划器 自动注册新增产品无需修改工厂classRRTPlanner:publicPlanner{public:voidplan()override{coutRRT planning...endl;}private:staticboolregistered_;};boolRRTPlanner::registered_[](){PlannerFactory::instance().registerPlanner(rrt,[](){returnmake_uniqueRRTPlanner();});returntrue;}();// 客户端测试代码intmain(){// 无需创建工厂实例直接通过单例获取产品autoplanner1PlannerFactory::instance().create(astar);if(planner1)planner1-plan();autoplanner2PlannerFactory::instance().create(rrt);if(planner2)planner2-plan();return0;}四、三种工厂模式对比表特性简单工厂模式工厂方法模式抽象工厂模式复杂度低中高扩展性差需修改工厂好新增产品工厂很好新增产品族适用场景产品少、基本不扩展单一产品族、频繁扩展多系列关联产品族开闭原则违反遵守产品族扩展遵守产品等级扩展违反依赖关系客户端依赖具体类客户端依赖抽象客户端依赖抽象接口核心职责一个工厂创建所有产品一个工厂对应一个产品一个工厂创建一族产品五、工程最佳实践优先使用智能指针如unique_ptr管理对象生命周期避免裸指针导致的内存泄漏注册式工厂示例已采用。大型项目首选注册式工厂支持插件化扩展新增产品无需修改工厂代码适配机器人、SLAM、导航等复杂系统。配置驱动创建通过JSON/YAML配置文件指定产品类型系统运行时动态创建对应对象提升灵活性。避免过度设计如果对象创建逻辑简单无复杂初始化直接使用构造函数即可无需强行使用工厂模式。结合其他设计模式工厂模式常与单例模式如注册式工厂、策略模式如动态选择产品类型、插件系统搭配使用。六、编译运行说明以上每段代码均可单独保存为.cpp文件如simple_factory.cpp、factory_method.cpp。使用g编译需支持C11标准命令如下g 文件名.cpp -o 可执行文件名 -stdc11运行可执行文件Linux/Mac./可执行文件名工程选型建议简单业务用简单工厂单一产品族用工厂方法多关联产品族用抽象工厂大型项目用注册式工厂。