设计模式读书笔记(一) Abstract Factory(抽象工厂)模式
来源:互联网 发布:程序员猝死的原因 编辑:程序博客网 时间:2024/04/29 08:17
一段时间没上博客了,总觉得各种忙,也不知道在忙些啥,瞎忙活的感觉,仔细想了一下,还是每天抽时间出来好好看看书,在博客上记录一下自己的成长过程。闲话不多说了,开始吧~~
先简单的介绍一下一般的设计模式包含哪些,还有他们的目的是什么吧:
一、抽象工厂的介绍
Abstract Factory—抽象工厂,是一种对象创建型的模式,它的意图是提供一个可以创建一系列相关或互相依赖对象的接口,而无须指定它们具体的类。
二、适用性
- 一个系统要独立于它的产品创建和组合
- 一个系统中多个产品需要根据配置来选择
- 当你提供一个产品类库,而只是想显示他们的接口而不是实现的时候
三、结构图
四、代码例子
假设我们现在需要建立一个RPG游戏,玩家在开始的时候选择角色职业:Knight(骑士),Assassin(刺客),每个职业有自己的武器Weapon。
现在我们可以先定义抽象产品:
class Character{public: Character(){}; ~Character(){if(m_Weapon) delete m_Weapon;}; virtural void Speak(){}; Weapon *m_Weapon;}
class Weapon{public: Weapon(){}; ~Weapon(){}; virtual void SetDamage(int damage){};}
接下来我们定义实体产品:
class Knight:public Character{public: Knight(){}; ~Knight(){} void Speak() { cout<<"I am Knight!"<<endl; }}
class Assassin:public Character{public: Assassin(){}; ~Assassin(){} void Speak() { cout<<"I am Assassin!"<<endl; }}
class Sword:public Weapon{public: Sword(){}; ~Sword(){}; void SetDamage(int d) { m_Damage = d; cout<<"Sword"<<endl; }private: int m_Damage;}
class Knife:public Weapon{public: Knife(){}; ~Knife(){}; void SetDamage(int d) { m_Damage = d; cout<<"Knife"<<endl; }private: int m_Damage;}
下面我们定义抽象工厂类
class PlayerCreator{public: PlayerCreator(){}; ~PlayerCreator(){}; virtural Character *CreateCharacter(){}; virtural Weapon *CreateWeapon(){};}
接下来定义实体工厂类:
class KnightCreator:public PlayerCreator{public: KnightCreator(){}; ~KnightCreator(){}; virtural Character *CreateCharacter() { return new Knight(); } virtural Weapon *CreateWeapon() { Weapon *p = new Sword(); p->SetDamage(5); return p; }}
class AssassinCreator:public PlayerCreator{public: AssassinCreator(){}; ~AssassinCreator(){}; virtural Character *CreateCharacter() { return new Assassin(); } virtural Weapon *CreateWeapon() { Weapon *p = new Knife(); p->SetDamage(2); return p; }}
下面是客户端调用:
enum PlayerType{ Knight = 0, Assassin=1}int main(){ PlayerType type; PlayerCreator *creator = NULL; Character *character = NULL; Weapon *weapon = NULL; if(type == PlayerType::Knight) { creator = new KnightCreator(); } else { creator = new AssassinCreator(); } character = creator->CreateCharactor(); weapon = creator->CreateWeapon(); character->Speak(); character->m_Weapon = weapon;}
PS:以上代码未经测试,全凭感觉写,如有错误之处,请指出,谢谢~
五、总结
- 抽象工厂分离了具体的类
- 易于产品的交换
- 有利于实现产品的一致性
- 难以支持新种类的产品,如果新产品接口属性不一样,需要改变较多
0 0
- 设计模式 一 抽象工厂Abstract Factory(工厂模式)
- ios设计模式读书笔记----Abstract Factory(抽象工厂)
- 设计模式读书笔记:Abstract Factory(抽象工厂)
- 设计模式读书笔记(一) Abstract Factory(抽象工厂)模式
- 抽象工厂(Abstract Factory)设计模式
- 设计模式-抽象工厂(Abstract Factory)
- 抽象工厂(Abstract Factory)设计模式
- 设计模式-抽象工厂(Abstract Factory)
- 设计模式(一) 抽象工厂(Abstract Factory)
- 设计模式读书笔记之抽象工厂模式(Abstract Factory)
- 设计模式读书笔记之抽象工厂模式(Abstract Factory)
- 设计模式(3)抽象工厂模式(Abstract Factory)
- .Net设计模式之抽象工厂模式(Abstract Factory)
- .NET设计模式:抽象工厂模式(Abstract Factory)
- .NET设计模式-抽象工厂模式(Abstract Factory)
- .NET设计模式:抽象工厂模式(Abstract Factory)
- 设计模式3:Abstract Factory Pattern(抽象工厂模式)
- 设计模式(二)之Abstract Factory - 抽象工厂模式
- ubuntu下小米真机调试
- Dubbo实战教程--Hudson持续集成服务器的安装配置与使用
- 【年度技术观点合集】计算机视觉,自然语言,机器学习…看看顶级科学家们怎么说
- activiti5.13 框架 数据库设计说明书
- [SCU 4522] 寻找fly真迹 (脑洞+构造)
- 设计模式读书笔记(一) Abstract Factory(抽象工厂)模式
- 解决电脑卡住不能显示桌面怎么办?
- 【年度开源、工具合集】牛津计划,DMTK,Graph Engine…提高你的工作效率!
- cocos2dx 历史版本下载问题
- MyEclipse 7.0 用java代码生成序列号
- 笔试题74. LeetCode OJ (61)
- 磁盘排序
- 【年度学术大会合集】SIGGRAPH,KDD,AAAI,NIPS…这些你想参加的会议
- 【牛腩】总览