news 2026/6/10 15:48:54

工厂模式详细讲解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
工厂模式详细讲解

一、工厂模式的定位

工厂模式是创建型设计模式的核心,核心思想是将对象的创建与使用分离:把对象创建的复杂逻辑封装在“工厂类”中,业务代码(调用方)只需通过工厂获取对象,无需关注对象的实例化细节(如构造函数参数、子类选择等)。它主要解决了“直接new对象导致的代码耦合、扩展困难”问题,同时让代码更符合开闭原则和单一职责原则。主要分为简单工厂、工厂方法、抽象工厂三种形式,适配不同的业务场景。

二、分类讲解

  1. 简单工厂
  • 定义:由一个单一的工厂类,根据传入的参数动态创建对应产品实例(不属于GoF官方23种设计模式,是工厂方法的简化版)。
  • 举例:RPG游戏中,用 SimpleCharacterFactory 接收 “warrior” / “mage” 参数,内部通过 switch 判断,分别创建 Warrior / Mage 对象。
  • 优点:简化对象创建,调用方只需传参;缺点:新增角色(如弓箭手)需修改工厂类的 switch 逻辑,违反开闭原则,仅适合产品类型少且变动少的场景。
  1. 工厂方法
  • 定义:定义抽象工厂接口,让具体工厂子类决定实例化哪个产品类,把对象实例化延迟到子类。
  • 举例:先定义抽象工厂 CharacterFactory ,再为战士、法师分别创建 WarriorFactory 、 MageFactory 子类,每个子类重写 createCharacter 方法创建对应角色。
  • 优点:新增角色只需加产品类和对应工厂子类,无需改原有代码,符合开闭原则;缺点:产品和工厂一一对应,产品过多时会产生大量工厂类,增加代码复杂度。
  1. 抽象工厂
  • 定义:创建相关/依赖的产品族,而非单一产品,接口中定义多个产品的创建方法。
  • 举例:RPG游戏中,“角色+武器”是产品族: HumanFactory 创建人类战士+人类剑, ElfFactory 创建精灵弓箭手+精灵弓,抽象工厂 RaceFactory 定义 createCharacter 和 createWeapon 两个接口。
  • 优点:保证产品族内对象的兼容性;缺点:新增产品(如防具)需修改抽象工厂接口,所有具体工厂都要同步修改,扩展成本高。

三种工厂模式对比表

模式类型工厂类特点产品创建逻辑开闭原则兼容性
简单工厂单一工厂类,静态方法工厂内部判断参数不兼容
工厂方法抽象工厂+多个具体工厂子类子类实现创建逻辑兼容
抽象工厂抽象工厂+产品族工厂子类子类创建产品族产品族扩展兼容

三、代码实现(三种工厂模式)

#include<iostream>#include<memory>#include<string>usingnamespacestd;classCharacter{protected:string name;inthealth;intattack;intmagic;public:Character(conststring&n,inth,inta,intm):name(n),health(h),attack(a),magic(m){}virtual~Character()=default;virtualvoidshowInfo()const{cout<<"角色:"<<name<<endl;cout<<"血量:"<<health<<endl;cout<<"攻击力:"<<attack<<endl;cout<<"魔力:"<<magic<<endl;}virtualvoidspecialSkill()=0;stringgetName()const{returnname;}};//具体角色类 - 战士classWarrior:publicCharacter{public:Warrior(conststring&name):Character(name,150,80,20){}voidspecialSkill()override{cout<<name<<"使用【狂暴攻击】!"<<endl;}voidshowInfo()constoverride{cout<<"=== 战士 ==="<<endl;Character::showInfo();cout<<"特长:近战攻击,高血量"<<endl;}};//具体角色类 - 法师classMage:publicCharacter{public:Mage(conststring&name):Character(name,80,30,120){}voidspecialSkill()override{cout<<name<<"释放【豪火球】!"<<endl;}voidshowInfo()constoverride{cout<<"=== 法师 ==="<<endl;Character::showInfo();cout<<"特长:魔法攻击,高魔力"<<endl;}};//具体角色类 - 弓箭手classArcher:publicCharacter{public:Archer(conststring&name):Character(name,100,70,50){}voidspecialSkill()override{cout<<name<<"使用【穿透射击】!"<<endl;}voidshowInfo()constoverride{cout<<"=== 弓箭手 ==="<<endl;Character::showInfo();cout<<"特长:远程攻击,平衡属性"<<endl;}};/****************************简单工厂***************************/enumCharacterType{WARRIOR,MAGE,ARCHER,};classSimpleCharacterFactory{public:staticunique_ptr<Character>CreateCharacter(CharacterType type,conststring&name){switch(type){caseWARRIOR:returnmake_unique<Warrior>(name);caseMAGE:returnmake_unique<Mage>(name);caseARCHER:returnmake_unique<Archer>(name);default:throwinvalid_argument("未知的角色类型");}}};/*******************************工厂方法*******************************/classCharacterFactory{protected:virtualvoidsetupCharacter(Character*character){cout<<"角色"<<character->getName()<<"创建完成,进行基础设置..."<<endl;}public:virtual~CharacterFactory()=default;virtualunique_ptr<Character>createCharacter(conststring&name)=0;unique_ptr<Character>createCharacterWithSetup(conststring&name){autocharacter=createCharacter(name);setupCharacter(character.get());returncharacter;}};classWarriorFactory:publicCharacterFactory{protected:virtualvoidsetupCharacter(Character*character){CharacterFactory::setupCharacter(character);cout<<"为战士配备铁剑和盾牌..."<<endl;}public:virtualunique_ptr<Character>createCharacter(conststring&name){returnmake_unique<Warrior>(name);}};classMageFactory:publicCharacterFactory{protected:virtualvoidsetupCharacter(Character*character){CharacterFactory::setupCharacter(character);cout<<"为法师配备魔法书和法杖..."<<endl;}public:virtualunique_ptr<Character>createCharacter(conststring&name){returnmake_unique<Mage>(name);}};classArcherFactory:publicCharacterFactory{protected:virtualvoidsetupCharacter(Character*character){CharacterFactory::setupCharacter(character);cout<<"为弓箭手配备弓箭和箭筒..."<<endl;}public:virtualunique_ptr<Character>createCharacter(conststring&name){returnmake_unique<Archer>(name);}};/********************************抽象工厂*****************************///抽象装备类classEquipment{public:virtual~Equipment()=default;virtualstringgetDescription()const=0;};//具体装备类classHumanSword:publicEquipment{public:stringgetDescription()constoverride{return"人族青钢剑";}};classHumanShield:publicEquipment{public:stringgetDescription()constoverride{return"人类骑士盾";}};classElfBow:publicEquipment{public:stringgetDescription()constoverride{return"精灵月光弓";}};classElfCloak:publicEquipment{public:stringgetDescription()constoverride{return"精灵隐身斗篷";}};//抽象工厂 - 种族工厂classRaceFactory{public:virtual~RaceFactory()=default;virtualunique_ptr<Character>createWarrior(conststring&name)=0;virtualunique_ptr<Character>createArcher(conststring&name)=0;virtualunique_ptr<Equipment>createWeapon()=0;virtualunique_ptr<Equipment>createArmor()=0;virtualstringgetRaceName()const=0;};//具体种族角色类classHumanWarrior:publicWarrior{public:HumanWarrior(conststring&name):Warrior(name+"(人族)"){}voidshowInfo()constoverride{cout<<"=== 人族战士 ==="<<endl;Character::showInfo();cout<<"特长:均衡发展,适应力强"<<endl;}};classElfArcher:publicArcher{public:ElfArcher(conststring&name):Archer(name+"(精灵)"){}voidshowInfo()constoverride{cout<<"=== 精灵弓箭手 ==="<<endl;Character::showInfo();cout<<"特长:敏捷过人,箭术精悍"<<endl;}};//具体工厂类 - 人族工厂classHumanFactory:publicRaceFactory{public:unique_ptr<Character>createWarrior(conststring&name)override{returnmake_unique<HumanWarrior>(name);}unique_ptr<Character>createArcher(conststring&name)override{returnmake_unique<Archer>(name+"(人族)");}unique_ptr<Equipment>createWeapon()override{returnmake_unique<HumanSword>();}unique_ptr<Equipment>createArmor()override{returnmake_unique<HumanShield>();}stringgetRaceName()constoverride{return"人族";}};//具体工厂类 - 精灵工厂classElfFactory:publicRaceFactory{public:unique_ptr<Character>createWarrior(conststring&name)override{returnmake_unique<Warrior>(name);}unique_ptr<Character>createArcher(conststring&name)override{returnmake_unique<ElfArcher>(name+"(精灵)");}unique_ptr<Equipment>createWeapon()override{returnmake_unique<ElfBow>();}unique_ptr<Equipment>createArmor()override{returnmake_unique<ElfCloak>();}stringgetRaceName()constoverride{return"精灵";}};intmain(){cout<<"=== 工厂模式对比演示 ==="<<endl;cout<<"\n1.简单工厂 - 集中式创建:"<<endl;cout<<"优点:实现简单,使用方便"<<endl;cout<<"缺点:违反开闭原则,拓展需要修改工厂类"<<endl;autosimpleWarrior=SimpleCharacterFactory::CreateCharacter(CharacterType::WARRIOR,"简单战士");cout<<"创建结果:"<<simpleWarrior->getName()<<endl;cout<<"\n2.工厂方法 - 多态创建:"<<endl;cout<<"优点:符合开闭原则,易于扩展"<<endl;cout<<"缺点:需要创建多个工厂类"<<endl;automethodFactory=make_unique<WarriorFactory>();automethodWarrior=methodFactory->createCharacterWithSetup("方法战士");cout<<"创建结果:"<<methodWarrior->getName()<<endl;cout<<"\n3.抽象工厂 - 产品族创建:"<<endl;cout<<"优点:可以创建相关产品族,保证产品兼容性"<<endl;cout<<"缺点:扩展产品族较困难"<<endl;autoabstractFactory=make_unique<HumanFactory>();autoabstractWarrior=abstractFactory->createWarrior("抽象战士");autoabstractWeapon=abstractFactory->createWeapon();cout<<"创建结果:"<<abstractWarrior->getName()<<" + "<<abstractWeapon->getDescription()<<endl;return0;}

运行结果:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 1:19:25

突发!陈立杰入职OpenAI

henry 发自 凹非寺 转载自&#xff1a;量子位&#xff08;QbitAI&#xff09;最新消息&#xff1a;姚班大神陈立杰&#xff0c;加盟OpenAI了。据“Top华人社消息”&#xff0c;OpenAI内部确认&#xff1a;清华姚班天才、UC伯克利EECS助理教授陈立杰已加盟OpenAI&#xff0c;负责…

作者头像 李华
网站建设 2026/6/10 8:00:12

Sharp-dumpkey微信数据库密钥提取工具完全使用手册

Sharp-dumpkey微信数据库密钥提取工具完全使用手册 【免费下载链接】Sharp-dumpkey 基于C#实现的获取微信数据库密钥的小工具 项目地址: https://gitcode.com/gh_mirrors/sh/Sharp-dumpkey 还在为无法访问微信聊天记录备份而烦恼吗&#xff1f;Sharp-dumpkey作为专业的微…

作者头像 李华
网站建设 2026/6/10 8:03:05

中文用户必看!sam3提示词分割模型英文Prompt使用技巧

中文用户必看&#xff01;sam3提示词分割模型英文Prompt使用技巧 1. 背景与问题引入 随着视觉基础模型的快速发展&#xff0c;图像分割技术已从传统的手动标注和专用训练&#xff0c;演进到“提示即服务”&#xff08;Prompt-as-a-Service&#xff09;的新范式。SAM3&#xf…

作者头像 李华
网站建设 2026/6/10 7:54:14

突破性设计:打造专业级SI4735 Arduino无线电接收器

突破性设计&#xff1a;打造专业级SI4735 Arduino无线电接收器 【免费下载链接】SI4735 SI473X Library for Arduino 项目地址: https://gitcode.com/gh_mirrors/si/SI4735 如何解决传统无线电接收器在SSB模式下的稳定性问题&#xff1f;本文将通过完整的硬件设计、信号…

作者头像 李华
网站建设 2026/6/10 8:02:37

DeepSeek-R1-Distill-Qwen-1.5B多实例部署:GPU共享利用实战优化

DeepSeek-R1-Distill-Qwen-1.5B多实例部署&#xff1a;GPU共享利用实战优化 1. 引言 随着大模型在实际业务场景中的广泛应用&#xff0c;如何高效部署轻量化模型以实现资源利用率最大化成为工程落地的关键挑战。DeepSeek-R1-Distill-Qwen-1.5B作为一款基于知识蒸馏技术构建的…

作者头像 李华
网站建设 2026/6/10 8:01:35

GHelper完全指南:华硕笔记本性能调校的终极解决方案

GHelper完全指南&#xff1a;华硕笔记本性能调校的终极解决方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地址:…

作者头像 李华