前言还记得初次接触工厂模式时各种产品、具体工厂、抽象产品等专业术语让我一头雾水。直到我通过游戏角色创建和披萨店运营这两个生活化案例来理解才真正掌握其精髓。本文将通过通俗易懂的讲解和完整的C代码示例系统讲解简单工厂、工厂方法和抽象工厂三种设计模式。一、为什么需要工厂模式传统创建方式的痛点假设你在开发一款RPG游戏需要创建不同角色// 游戏主流程中分散的创建代码 int main() { // 玩家选择战士 Warrior* player new Warrior(); player-attack(); // 任务NPC创建法师 Mage* npc new Mage(); npc-castSpell(); // Boss战创建弓箭手 Archer* boss new Archer(); boss-shoot(); // 维护痛点 // 1. 删除战士职业需要修改所有new Warrior()的地方 // 2. 新增职业需要修改多处创建逻辑 return 0; }主要问题创建逻辑分散维护困难客户端与具体类高度耦合违反开闭原则扩展需修改现有代码工厂模式的核心价值封装对象创建过程让客户端只需关注使用什么而不用关心如何创建。二、简单工厂模式角色创建中心2.1 生活案例餐厅点餐在餐厅点餐时你只需告诉服务员要一份芝士披萨服务员会向后厨下单。你不需要知道披萨的具体做法和厨师是谁。这里的服务员就是简单工厂。2.2 游戏实现统一角色创建#include iostream #include memory #include string // 角色基类 class Character { public: virtual ~Character() default; virtual void attack() 0; virtual std::string getClassName() 0; }; // 具体角色 class Warrior : public Character { public: void attack() override { std::cout ⚔️ 战士旋风斩造成150点伤害\n; } std::string getClassName() override { return 战士; } }; class Mage : public Character { public: void attack() override { std::cout 法师火球术造成200点魔法伤害\n; } std::string getClassName() override { return 法师; } }; class Archer : public Character { public: void attack() override { std::cout 弓箭手三重射击造成120点伤害\n; } std::string getClassName() override { return 弓箭手; } }; // 简单工厂 class SimpleCharacterFactory { public: static std::unique_ptrCharacter createCharacter(const std::string type) { if (type warrior) return std::make_uniqueWarrior(); if (type mage) return std::make_uniqueMage(); if (type archer) return std::make_uniqueArcher(); throw std::invalid_argument(无效职业 type); } }; // 使用示例 int main() { std::cout 简单工厂模式演示 \n\n; // 创建战士角色 auto player SimpleCharacterFactory::createCharacter(warrior); std::cout 创建职业 player-getClassName() \n; player-attack(); // 创建法师NPC auto npc SimpleCharacterFactory::createCharacter(mage); std::cout 创建职业 npc-getClassName() \n; npc-attack(); return 0; }输出结果 简单工厂模式演示 创建职业战士 ⚔️ 战士旋风斩造成150点伤害 创建职业法师 法师火球术造成200点魔法伤害2.3 披萨店实现#include iostream #include memory #include string // 披萨基类 class Pizza { public: virtual ~Pizza() default; virtual void prepare() 0; virtual void bake() { std::cout 烘烤15分钟\n; } virtual void box() { std::cout 装盒完成\n; } }; // 具体披萨 class CheesePizza : public Pizza { public: void prepare() override { std::cout 芝士披萨加入马苏里拉芝士、番茄酱\n; } }; class PepperoniPizza : public Pizza { public: void prepare() override { std::cout 腊肠披萨加入意式辣味腊肠、芝士\n; } }; // 简单工厂 class SimplePizzaFactory { public: static std::unique_ptrPizza createPizza(const std::string type) { if (type cheese) return std::make_uniqueCheesePizza(); if (type pepperoni) return std::make_uniquePepperoniPizza(); throw std::invalid_argument(无此披萨类型); } }; // 披萨店 class PizzaStore { public: void orderPizza(const std::string type) { auto pizza SimplePizzaFactory::createPizza(type); std::cout \n制作 type 披萨\n; pizza-prepare(); pizza-bake(); pizza-box(); } }; int main() { PizzaStore store; store.orderPizza(cheese); store.orderPizza(pepperoni); return 0; }2.4 模式总结优势实现简单集中管理创建逻辑客户端只需传入参数无需了解创建细节局限新增产品类型需要修改工厂类产品类型多时工厂类会臃肿适用场景产品类型较少且稳定的简单项目三、工厂方法模式专业化创建3.1 生活案例连锁披萨店假设你经营全国连锁披萨店纽约分店制作薄底披萨芝加哥分店制作深盘披萨。总部制定准备→烘烤→装盒的标准流程但各分店自行实现具体制作方法。3.2 游戏实现职业训练营#include iostream #include memory #include string // 角色基类 class Character { public: virtual ~Character() default; virtual void attack() 0; virtual std::string getClassName() 0; }; class Warrior : public Character { public: void attack() override { std::cout ⚔️ 战士英勇打击\n; } std::string getClassName() override { return 战士; } };class Archer : public Character { public: void attack() override { std::cout 弓箭手箭雨\n; } std::string getClassName() override { return 弓箭手; } }; // 抽象工厂训练营 class CharacterFactory { public: virtual ~CharacterFactory() default; // 工厂方法由子类实现具体角色创建 virtual std::unique_ptrCharacter createCharacter() 0; // 模板方法定义标准训练流程 void trainCharacter() { auto character createCharacter(); std::cout 训练 character-getClassName() 完成\n; character-attack(); std::cout -------------------\n; } }; // 具体工厂职业训练营 class WarriorFactory : public CharacterFactory { public: std::unique_ptrCharacter createCharacter() override { return std::make_uniqueWarrior(); } }; class MageFactory : public CharacterFactory { public: std::unique_ptrCharacter createCharacter() override { return std::make_uniqueMage(); } }; class ArcherFactory : public CharacterFactory { public: std::unique_ptrCharacter createCharacter() override { return std::make_uniqueArcher(); } }; // 使用示例 int main() { std::cout 工厂方法模式演示 \n\n; // 初始化各职业训练营 WarriorFactory warriorCamp; MageFactory mageCamp; ArcherFactory archerCamp; // 执行训练流程 warriorCamp.trainCharacter(); mageCamp.trainCharacter(); archerCamp.trainCharacter(); // 扩展说明只需添加新工厂类即可支持新职业 // 示例class PriestFactory : public CharacterFactory { ... }; return 0; }运行结果 工厂方法模式演示 训练战士完成 ⚔️ 战士英勇打击 ------------------- 训练法师完成 法师暴风雪 ------------------- 训练弓箭手完成 弓箭手箭雨 -------------------3.3 披萨店实现#include iostream #include memory // 披萨基类 class Pizza { public: virtual ~Pizza() default; virtual void prepare() 0; virtual void bake() 0; virtual void box() { std::cout 装盒\n; } }; // 纽约风味披萨 class NYStyleCheesePizza : public Pizza { public: void prepare() override { std::cout 纽约芝士披萨薄底、新鲜马苏里拉\n; } void bake() override { std::cout 砖炉高温快烤10分钟\n; } }; // 芝加哥风味披萨 class ChicagoStyleCheesePizza : public Pizza { public: void prepare() override { std::cout ️ 芝加哥深盘芝士披萨厚底、大量芝士\n; } void bake() override { std::cout 深烤盘慢烤45分钟\n; } }; // 抽象披萨店 class PizzaStore { public: virtual ~PizzaStore() default; // 标准制作流程模板方法 void orderPizza() { auto pizza createPizza(); std::cout \n getStoreName() \n; pizza-prepare(); pizza-bake(); pizza-box(); std::cout 请享用\n; } protected: // 工厂方法由子类实现具体披萨类型 virtual std::unique_ptrPizza createPizza() 0; virtual std::string getStoreName() 0; }; // 纽约分店 class NYPizzaStore : public PizzaStore { protected: std::unique_ptrPizza createPizza() override { return std::make_uniqueNYStyleCheesePizza(); } std::string getStoreName() override { return 纽约曼哈顿店; } }; // 芝加哥分店 class ChicagoPizzaStore : public PizzaStore { protected: std::unique_ptrPizza createPizza() override { return std::make_uniqueChicagoStyleCheesePizza(); } std::string getStoreName() override { return 芝加哥深盘总店; } }; int main() { NYPizzaStore nyStore; ChicagoPizzaStore chicagoStore; nyStore.orderPizza(); chicagoStore.orderPizza(); return 0; }3.4 工厂方法模式总结核心思想将对象创建委托给子类由子类决定实例化哪个具体类。优点符合开闭原则便于扩展新产品客户端仅依赖抽象接口缺点每个产品需对应一个工厂类增加系统复杂度适用场景需要灵活扩展产品类型的系统四、抽象工厂模式装备套装系统4.1 生活类比统一供应链经营高端披萨连锁时需确保意大利分店使用全套意式原料有机分店使用全套有机食材禁止跨系列原料混用4.2 游戏实现套装装备#include iostream #include memory #include string // 抽象武器 class Weapon { public: virtual ~Weapon() default; virtual void use() 0; }; // 具体武器 class Sword : public Weapon { public: void use() override { std::cout ️ 挥动长剑\n; } }; class Staff : public Weapon { public: void use() override { std::cout 挥舞法杖\n; } }; class Bow : public Weapon { public: void use() override { std::cout 拉弓射箭\n; } }; // 抽象防具 class Armor { public: virtual ~Armor() default; virtual void equip() 0; }; // 具体防具 class HeavyArmor : public Armor { public:class Robe : public Armor { public: void equip() override { std::cout 装备法袍魔力50\n; } }; class LeatherArmor : public Armor { public: void equip() override { std::cout 装备皮甲敏捷50\n; } }; // 装备套装抽象工厂 class EquipmentFactory { public: virtual ~EquipmentFactory() default; virtual std::unique_ptrWeapon createWeapon() 0; virtual std::unique_ptrArmor createArmor() 0; }; // 战士装备工厂 class WarriorEquipmentFactory : public EquipmentFactory { public: std::unique_ptrWeapon createWeapon() override { return std::make_uniqueSword(); } std::unique_ptrArmor createArmor() override { return std::make_uniqueHeavyArmor(); } }; // 法师装备工厂 class MageEquipmentFactory : public EquipmentFactory { public: std::unique_ptrWeapon createWeapon() override { return std::make_uniqueStaff(); } std::unique_ptrArmor createArmor() override { return std::make_uniqueRobe(); } }; // 弓箭手装备工厂 class ArcherEquipmentFactory : public EquipmentFactory { public: std::unique_ptrWeapon createWeapon() override { return std::make_uniqueBow(); } std::unique_ptrArmor createArmor() override { return std::make_uniqueLeatherArmor(); } }; // 使用装备工厂的角色类 class GameCharacter { private: std::unique_ptrWeapon weapon; std::unique_ptrArmor armor; std::string name; public: GameCharacter(const std::string name, std::unique_ptrEquipmentFactory factory) : name(name) { weapon factory-createWeapon(); armor factory-createArmor(); } void showEquipment() { std::cout \n角色 name \n; std::cout 装备检查\n; weapon-use(); armor-equip(); std::cout --- 装备成套属性匹配 ✅ ---\n; } }; int main() { std::cout 抽象工厂模式演示 \n; // 创建战士角色 GameCharacter warrior(亚瑟, std::make_uniqueWarriorEquipmentFactory()); warrior.showEquipment(); // 创建法师角色 GameCharacter mage(甘道夫, std::make_uniqueMageEquipmentFactory()); mage.showEquipment(); // 创建弓箭手角色 GameCharacter archer(莱戈拉斯, std::make_uniqueArcherEquipmentFactory()); archer.showEquipment(); return 0; }运行结果 抽象工厂模式演示 角色亚瑟 装备检查 ️ 挥动长剑 ️ 装备重甲防御50 --- 装备成套属性匹配 ✅ --- 角色甘道夫 装备检查 挥舞法杖 装备法袍魔力50 --- 装备成套属性匹配 ✅ --- 角色莱戈拉斯 装备检查 拉弓射箭 装备皮甲敏捷50 --- 装备成套属性匹配 ✅ ---4.3 披萨店原料供应链实现#include iostream #include memory // 抽象原料工厂 class IngredientFactory { public: virtual ~IngredientFactory() default; virtual std::string createDough() 0; virtual std::string createSauce() 0; virtual std::string createCheese() 0; }; // 意大利原料工厂 class ItalianIngredientFactory : public IngredientFactory { public: std::string createDough() override { return 意大利00号面粉; } std::string createSauce() override { return 圣马扎诺番茄酱; } std::string createCheese() override { return 帕尔马芝士; } }; // 有机原料工厂 class OrganicIngredientFactory : public IngredientFactory { public: std::string createDough() override { return 有机全麦面粉; } std::string createSauce() override { return 有机番茄酱; } std::string createCheese() override { return 有机马苏里拉; } }; // 披萨类 class Pizza { private: std::unique_ptrIngredientFactory factory; public: Pizza(std::unique_ptrIngredientFactory f) : factory(std::move(f)) {} void prepare() { std::cout 制作披萨\n; std::cout 面团 factory-createDough() \n; std::cout 酱料 factory-createSauce() \n; std::cout 芝士 factory-createCheese() \n; std::cout 所有原料来自同一产地 ✅\n; } }; int main() { std::cout 意大利风情店 \n; Pizza italianPizza(std::make_uniqueItalianIngredientFactory()); italianPizza.prepare(); std::cout \n 有机健康店 \n; Pizza organicPizza(std::make_uniqueOrganicIngredientFactory()); organicPizza.prepare(); return 0; }4.4 抽象工厂模式总结核心思想创建相关对象系列确保产品兼容性。优点保证产品族一致性客户端与具体产品解耦缺点扩展新产品需修改接口适用场景需要成套产品的场景UI组件、游戏装备等五、三种模式核心对比5.1 核心概念速览// 简单工厂通过字符串参数创建对象 auto character SimpleFactory::create(warrior); // 工厂方法每个产品对应专属工厂 WarriorFactory factory; auto character factory.create(); // 抽象工厂创建配套产品系列 WarriorEquipmentFactory equipFactory; auto weapon equipFactory.createWeapon(); // 配套武器 auto armor equipFactory.createArmor(); // 配套防具5.2 模式选择指南使用场景推荐模式产品类型少且稳定5种简单工厂需要频繁扩展产品线工厂方法⭐需要确保产品兼容性抽象工厂快速开发原型直接实例化5.3 架构关系图解简单工厂 客户端 → [中央工厂] → 产品A/产品B/产品C (集中式生产) 工厂方法 客户端 → 抽象工厂接口 ├→ 工厂A → 产品A ├→ 工厂B → 产品B └→ 工厂C → 产品C (分散式生产) 抽象工厂 客户端 → 抽象工厂接口 ├→ 工厂X → 产品X1 产品X2 └→ 工厂Y → 产品Y1 产品Y2 (系列化生产)六、最佳实践6.1 应用场景判断代码中充斥new ConcreteClass()→ 考虑简单工厂需要根据条件创建不同对象→ 采用工厂方法需要保持多对象风格一致→ 使用抽象工厂6.2 C实现要点// ✅ 最佳实践使用智能指针管理资源 virtual std::unique_ptrProduct create() 0; // ✅ 推荐C17智能指针构造 return std::make_uniqueConcreteProduct(); // ❌ 反模式返回原始指针 virtual Product* create() 0; // 存在内存泄漏风险6.3 常见误区警示避免过度使用简单场景直接实例化更合适模式认知简单工厂是编程范式非GoF标准模式设计平衡模式应用应以实际需求为准七、代码资源完整可编译的C17示例代码已就绪。编译指令# 简单工厂 g -stdc17 simple_factory.cpp -o simple_factory ./simple_factory # 工厂方法 g -stdc17 factory_method.cpp -o factory_method ./factory_method # 抽象工厂 g -stdc17 abstract_factory.cpp -o abstract_factory ./abstract_factory核心总结本质原则通过工厂模式实现对象创建与使用的解耦。简单工厂中央集权式生产工厂方法专业分工式生产抽象工厂系列配套式生产形象记忆法简单工厂是职业选择器、工厂方法是专业培训营、抽象工厂是风格套装生成器。掌握这个类比面试游刃有余推荐阅读《Head First 设计模式》GoF《设计模式可复用面向对象软件的基础》希望本指南助你彻底掌握工厂模式如果觉得有帮助欢迎点赞收藏~