2026/2/20 3:03:39
网站建设
项目流程
常州 网站建设,个人做网站 私活,wordpress 4.7.2 漏洞,淘宝优惠券怎么做网站一、工厂模式的定位
工厂模式是创建型设计模式的核心#xff0c;核心思想是将对象的创建与使用分离#xff1a;把对象创建的复杂逻辑封装在“工厂类”中#xff0c;业务代码#xff08;调用方#xff09;只需通过工厂获取对象#xff0c;无需关注对象的实例化细节#x…一、工厂模式的定位工厂模式是创建型设计模式的核心核心思想是将对象的创建与使用分离把对象创建的复杂逻辑封装在“工厂类”中业务代码调用方只需通过工厂获取对象无需关注对象的实例化细节如构造函数参数、子类选择等。它主要解决了“直接new对象导致的代码耦合、扩展困难”问题同时让代码更符合开闭原则和单一职责原则。主要分为简单工厂、工厂方法、抽象工厂三种形式适配不同的业务场景。二、分类讲解简单工厂定义由一个单一的工厂类根据传入的参数动态创建对应产品实例不属于GoF官方23种设计模式是工厂方法的简化版。举例RPG游戏中用 SimpleCharacterFactory 接收 “warrior” / “mage” 参数内部通过 switch 判断分别创建 Warrior / Mage 对象。优点简化对象创建调用方只需传参缺点新增角色如弓箭手需修改工厂类的 switch 逻辑违反开闭原则仅适合产品类型少且变动少的场景。工厂方法定义定义抽象工厂接口让具体工厂子类决定实例化哪个产品类把对象实例化延迟到子类。举例先定义抽象工厂 CharacterFactory 再为战士、法师分别创建 WarriorFactory 、 MageFactory 子类每个子类重写 createCharacter 方法创建对应角色。优点新增角色只需加产品类和对应工厂子类无需改原有代码符合开闭原则缺点产品和工厂一一对应产品过多时会产生大量工厂类增加代码复杂度。抽象工厂定义创建相关/依赖的产品族而非单一产品接口中定义多个产品的创建方法。举例RPG游戏中“角色武器”是产品族 HumanFactory 创建人类战士人类剑 ElfFactory 创建精灵弓箭手精灵弓抽象工厂 RaceFactory 定义 createCharacter 和 createWeapon 两个接口。优点保证产品族内对象的兼容性缺点新增产品如防具需修改抽象工厂接口所有具体工厂都要同步修改扩展成本高。三种工厂模式对比表模式类型工厂类特点产品创建逻辑开闭原则兼容性简单工厂单一工厂类静态方法工厂内部判断参数不兼容工厂方法抽象工厂多个具体工厂子类子类实现创建逻辑兼容抽象工厂抽象工厂产品族工厂子类子类创建产品族产品族扩展兼容三、代码实现(三种工厂模式)#includeiostream#includememory#includestringusingnamespacestd;classCharacter{protected:string name;inthealth;intattack;intmagic;public:Character(conststringn,inth,inta,intm):name(n),health(h),attack(a),magic(m){}virtual~Character()default;virtualvoidshowInfo()const{cout角色nameendl;cout血量healthendl;cout攻击力attackendl;cout魔力magicendl;}virtualvoidspecialSkill()0;stringgetName()const{returnname;}};//具体角色类 - 战士classWarrior:publicCharacter{public:Warrior(conststringname):Character(name,150,80,20){}voidspecialSkill()override{coutname使用【狂暴攻击】endl;}voidshowInfo()constoverride{cout 战士 endl;Character::showInfo();cout特长近战攻击高血量endl;}};//具体角色类 - 法师classMage:publicCharacter{public:Mage(conststringname):Character(name,80,30,120){}voidspecialSkill()override{coutname释放【豪火球】endl;}voidshowInfo()constoverride{cout 法师 endl;Character::showInfo();cout特长魔法攻击高魔力endl;}};//具体角色类 - 弓箭手classArcher:publicCharacter{public:Archer(conststringname):Character(name,100,70,50){}voidspecialSkill()override{coutname使用【穿透射击】endl;}voidshowInfo()constoverride{cout 弓箭手 endl;Character::showInfo();cout特长远程攻击平衡属性endl;}};/****************************简单工厂***************************/enumCharacterType{WARRIOR,MAGE,ARCHER,};classSimpleCharacterFactory{public:staticunique_ptrCharacterCreateCharacter(CharacterType type,conststringname){switch(type){caseWARRIOR:returnmake_uniqueWarrior(name);caseMAGE:returnmake_uniqueMage(name);caseARCHER:returnmake_uniqueArcher(name);default:throwinvalid_argument(未知的角色类型);}}};/*******************************工厂方法*******************************/classCharacterFactory{protected:virtualvoidsetupCharacter(Character*character){cout角色character-getName()创建完成进行基础设置...endl;}public:virtual~CharacterFactory()default;virtualunique_ptrCharactercreateCharacter(conststringname)0;unique_ptrCharactercreateCharacterWithSetup(conststringname){autocharactercreateCharacter(name);setupCharacter(character.get());returncharacter;}};classWarriorFactory:publicCharacterFactory{protected:virtualvoidsetupCharacter(Character*character){CharacterFactory::setupCharacter(character);cout为战士配备铁剑和盾牌...endl;}public:virtualunique_ptrCharactercreateCharacter(conststringname){returnmake_uniqueWarrior(name);}};classMageFactory:publicCharacterFactory{protected:virtualvoidsetupCharacter(Character*character){CharacterFactory::setupCharacter(character);cout为法师配备魔法书和法杖...endl;}public:virtualunique_ptrCharactercreateCharacter(conststringname){returnmake_uniqueMage(name);}};classArcherFactory:publicCharacterFactory{protected:virtualvoidsetupCharacter(Character*character){CharacterFactory::setupCharacter(character);cout为弓箭手配备弓箭和箭筒...endl;}public:virtualunique_ptrCharactercreateCharacter(conststringname){returnmake_uniqueArcher(name);}};/********************************抽象工厂*****************************///抽象装备类classEquipment{public:virtual~Equipment()default;virtualstringgetDescription()const0;};//具体装备类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_ptrCharactercreateWarrior(conststringname)0;virtualunique_ptrCharactercreateArcher(conststringname)0;virtualunique_ptrEquipmentcreateWeapon()0;virtualunique_ptrEquipmentcreateArmor()0;virtualstringgetRaceName()const0;};//具体种族角色类classHumanWarrior:publicWarrior{public:HumanWarrior(conststringname):Warrior(name(人族)){}voidshowInfo()constoverride{cout 人族战士 endl;Character::showInfo();cout特长均衡发展适应力强endl;}};classElfArcher:publicArcher{public:ElfArcher(conststringname):Archer(name(精灵)){}voidshowInfo()constoverride{cout 精灵弓箭手 endl;Character::showInfo();cout特长敏捷过人箭术精悍endl;}};//具体工厂类 - 人族工厂classHumanFactory:publicRaceFactory{public:unique_ptrCharactercreateWarrior(conststringname)override{returnmake_uniqueHumanWarrior(name);}unique_ptrCharactercreateArcher(conststringname)override{returnmake_uniqueArcher(name(人族));}unique_ptrEquipmentcreateWeapon()override{returnmake_uniqueHumanSword();}unique_ptrEquipmentcreateArmor()override{returnmake_uniqueHumanShield();}stringgetRaceName()constoverride{return人族;}};//具体工厂类 - 精灵工厂classElfFactory:publicRaceFactory{public:unique_ptrCharactercreateWarrior(conststringname)override{returnmake_uniqueWarrior(name);}unique_ptrCharactercreateArcher(conststringname)override{returnmake_uniqueElfArcher(name(精灵));}unique_ptrEquipmentcreateWeapon()override{returnmake_uniqueElfBow();}unique_ptrEquipmentcreateArmor()override{returnmake_uniqueElfCloak();}stringgetRaceName()constoverride{return精灵;}};intmain(){cout 工厂模式对比演示 endl;cout\n1.简单工厂 - 集中式创建endl;cout优点实现简单使用方便endl;cout缺点违反开闭原则拓展需要修改工厂类endl;autosimpleWarriorSimpleCharacterFactory::CreateCharacter(CharacterType::WARRIOR,简单战士);cout创建结果simpleWarrior-getName()endl;cout\n2.工厂方法 - 多态创建endl;cout优点符合开闭原则易于扩展endl;cout缺点需要创建多个工厂类endl;automethodFactorymake_uniqueWarriorFactory();automethodWarriormethodFactory-createCharacterWithSetup(方法战士);cout创建结果methodWarrior-getName()endl;cout\n3.抽象工厂 - 产品族创建endl;cout优点可以创建相关产品族保证产品兼容性endl;cout缺点扩展产品族较困难endl;autoabstractFactorymake_uniqueHumanFactory();autoabstractWarriorabstractFactory-createWarrior(抽象战士);autoabstractWeaponabstractFactory-createWeapon();cout创建结果abstractWarrior-getName() abstractWeapon-getDescription()endl;return0;}运行结果