news 2026/5/2 16:06:48

工厂模式详细讲解

作者头像

张小明

前端开发工程师

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/4/30 22:17:52

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 项目地址…

作者头像 李华
网站建设 2026/5/1 6:12:34

Solo-Learn自监督学习终极指南:PyTorch快速上手实践

Solo-Learn自监督学习终极指南&#xff1a;PyTorch快速上手实践 【免费下载链接】solo-learn solo-learn: a library of self-supervised methods for visual representation learning powered by Pytorch Lightning 项目地址: https://gitcode.com/gh_mirrors/so/solo-learn…

作者头像 李华
网站建设 2026/5/2 13:07:10

Windows 11系统清理终极指南:开源工具Win11Debloat完全使用教程

Windows 11系统清理终极指南&#xff1a;开源工具Win11Debloat完全使用教程 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本&#xff0c;用于从Windows中移除预装的无用软件&#xff0c;禁用遥测&#xff0c;从Windows搜索中移除Bing&#xff0c;以及执行各种其他更改…

作者头像 李华
网站建设 2026/4/28 22:33:12

DeepSeek-R1-Distill-Qwen-1.5B成本分析:GPU算力需求与优化方案

DeepSeek-R1-Distill-Qwen-1.5B成本分析&#xff1a;GPU算力需求与优化方案 1. 背景与技术定位 随着大语言模型在数学推理、代码生成和逻辑推导等复杂任务中的广泛应用&#xff0c;如何在有限的硬件资源下高效部署高性能推理模型成为工程落地的关键挑战。DeepSeek-R1-Distill…

作者头像 李华
网站建设 2026/4/17 16:00:40

Uncle小说PC版终极指南:新手如何免费获取全网小说资源?

Uncle小说PC版终极指南&#xff1a;新手如何免费获取全网小说资源&#xff1f; 【免费下载链接】uncle-novel &#x1f4d6; Uncle小说&#xff0c;PC版&#xff0c;一个全网小说下载器及阅读器&#xff0c;目录解析与书源结合&#xff0c;支持有声小说与文本小说&#xff0c;可…

作者头像 李华
网站建设 2026/5/1 6:51:58

终极微信数据库密钥提取指南:快速掌握数据解密技巧

终极微信数据库密钥提取指南&#xff1a;快速掌握数据解密技巧 【免费下载链接】Sharp-dumpkey 基于C#实现的获取微信数据库密钥的小工具 项目地址: https://gitcode.com/gh_mirrors/sh/Sharp-dumpkey 还在为无法访问微信聊天记录而烦恼吗&#xff1f;Sharp-dumpkey作为…

作者头像 李华