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

抽象工厂模式,就是把工厂类也给他多态了。

 

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

 


 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值