您的位置:首页 > 编程语言

用代码和UML图化解设计模式之《抽象工厂模式》

2012-10-21 01:45 741 查看
抽象工厂模式,就是把工厂类也给他多态了。

 

根据需求不同的工厂生产不品种的实体。比如在游戏中。 纯在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

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息