用代码和UML图化解设计模式之《抽象工厂模式》
来源:互联网 发布:常用的图像分割算法 编辑:程序博客网 时间:2024/05/14 21:51
抽象工厂模式,就是把工厂类也给他多态了。
根据需求不同的工厂生产不品种的实体。比如在游戏中。 纯在vip用户对应的vip的宠物对应的vip的怪物,或者vip任务。因此,vip工厂就生产vip这些东西了。但是普通的也要生产。因此 就抽象出来两个类了。
下面我是根据游戏中,不同的角色来定义的一些实体类。直接上图,大家就看明白了
也就是特殊对象特殊对待。因此工厂就要特殊了。也就是要把工厂类抽象出来一个。
下面就上打码了,代码量比较大。。不过自己很快就实现了。
/************************************************************************/ /* @filename abstractFactory.cpp 04. @author wallwind 05. @createtime 2012/10/21 00:40 06. @function 抽象工厂模式 07. @email wochenglin@qq.com 08.*/ /************************************************************************/ #include "stdafx.h"#include <iostream>using namespace std;//用户类class User{public: User (){}virtual ~User (){}virtual void attack() = 0;virtual void defense() = 0;};//怪物类class Monster{public: Monster (){}virtual ~Monster (){}virtual void attack() = 0;virtual void defense() = 0;};//宠物类class Pet{public: Pet (){}virtual ~Pet (){}virtual void attack() = 0;virtual void defense() = 0;};//游戏中还有很多角色。比如刀客,异人等class SwordUser:public User{public:SwordUser(){}~SwordUser(){}void attack(){cout<<"SwordUser:attack"<<endl;}void defense(){cout<<"SwordUser:defense"<<endl;}};class SpecialUser:public User{public:SpecialUser(){}~SpecialUser(){}void attack(){cout<<"SpecialUser:attack"<<endl;}void defense(){cout<<"SpecialUser:defense"<<endl;}};//////怪物氛围一般的怪物,和BOSS类。class GeneralMonster:public Monster{public:GeneralMonster(){}~GeneralMonster(){}void attack(){cout<<"GeneralMonster:attack"<<endl;}void defense(){cout<<"GeneralMonster:defense"<<endl;}};class BossMonster:public Monster{public:BossMonster(){}~BossMonster(){}void attack(){cout<<"BossMonster:attack"<<endl;}void defense(){cout<<"BossMonster:defense"<<endl;}};////宠物很多种,比如用来进攻的。还有用来骑得等等class AttackPet:public Pet{public:AttackPet(){}~AttackPet(){}void attack(){cout<<"AttackPet:attack"<<endl;}void defense(){cout<<"AttackPet:defense"<<endl;}};class GeneralPet:public Pet{public:GeneralPet(){}~GeneralPet(){}void attack(){cout<<"GeneralPet:attack"<<endl;}void defense(){cout<<"GeneralPet:defense"<<endl;}};////抽象工厂类class AbstractFactory{public:AbstractFactory(){}virtual ~AbstractFactory(){}virtual User * createUser() = 0;virtual Monster* createMonster() = 0;virtual Pet* createPet() = 0;};class SpecialFactory: public AbstractFactory{public :SpecialFactory(){}~SpecialFactory(){}User* createUser(){User *retUser;retUser = new SwordUser();return retUser;}Monster* createMonster(){Monster* retMonster;retMonster = new BossMonster();return retMonster;}Pet* createPet(){Pet* retPet;retPet = new AttackPet();return retPet;}};class GeneralFactory: public AbstractFactory{public :GeneralFactory(){}~GeneralFactory(){}User* createUser(){User *retUser;retUser = new SpecialUser();return retUser;}Monster* createMonster(){Monster* retMonster;retMonster = new GeneralMonster();return retMonster;}Pet* createPet(){Pet* retPet;retPet = new GeneralPet();return retPet;}};class RoleCreate{public:RoleCreate(AbstractFactory* af):m_role(af){}~RoleCreate(){if (m_role!=NULL){delete m_role;}}void factory(){m_role->createUser()->attack();m_role->createMonster()->attack();m_role->createPet()->attack();}private:AbstractFactory* m_role;};int _tmain(int argc, _TCHAR* argv[]){AbstractFactory* factory;factory= new SpecialFactory();RoleCreate role(factory);role.factory();factory = new GeneralFactory();RoleCreate role1(factory);role1.factory();if (factory!=NULL){delete factory;factory =NULL;}return 0;}
更多文章,欢迎访问:
http://blog.csdn.net/wallwind
- 用代码和UML图化解设计模式之《抽象工厂模式》
- 用代码和UML图化解设计模式之《工厂模式》
- 用代码和UML图化解设计模式之《策略模式》
- 用代码和UML图化解设计模式之《代理模式》
- 用代码和UML图化解设计模式之《门面模式》
- 用代码和UML图化解设计模式之《适配器模式》
- 用代码和UML图化解设计模式之《模板方法模式》
- 用代码和UML图化解设计模式之《创建者模式》
- 用代码和UML图化解设计模式之《桥接模式》
- 用代码和UML图化解设计模式之《命令模式》
- 用代码和UML图化解设计模式之《装饰模式》
- 用代码和UML图化解设计模式之《迭代器模式》
- 用代码和UML图化解设计模式之《观察者模式》
- 用代码和UML图化解设计模式之《责任链模式》
- 设计模式之 工厂模式 和 抽象工厂模式
- 设计模式之工厂方法模式和抽象工厂模式
- 设计模式之抽象工厂 代码示例
- 设计模式之工厂设计模式和抽象工厂
- 多核多线程同步
- S3C2440裸机实验之timer(定时器)
- 在FLV文件的TAG中写入H264数据
- Beyond MapReduce:谈2011年风靡的数据流计算系统(转)
- 1分钟内保护你的Linux服务器—Server Shield v1.0.2
- 用代码和UML图化解设计模式之《抽象工厂模式》
- 关于warning C4512: “`anonymous-namespace'::******”: 未能生成赋值运算符
- linux小技巧——添加永久生效的路由
- WINDOWS SERVER 2008密码丢失的处理(IBM x3650 m3)
- 收集几道题目
- tcpdump使用详解及评论摘要
- html5系列2-3 : DOCTYPE与渲染模式(三)
- 信用证明和隐私保护
- mysql显示所有的表内字段内