设计模式 每日一例 Abstract Factory

其实这一篇开始才真正进入设计模式的学习。

这里参照了这个Blog的例子:http://www.cppblog.com/converse/,为了直观和适应一个正在进行的项目需要做了命名上的一些修改。

/************************************************************************ 
* File Name  : AbstractFactory.h
* Description: 
* Author     : amphisbe
* Create Date: 2012/07/18
* Version    : 1.0
* Modified   :
* 
************************************************************************/
#ifndef __ABSTRACTFACTORY_H__
#define __ABSTRACTFACTORY_H__

//登入消息基类
class AbstractMsgLogin
{
public:
	AbstractMsgLogin(void){};
	virtual ~AbstractMsgLogin(void){};
};
//登入请求
class MsgLoginReq : public AbstractMsgLogin
{
public:
	MsgLoginReq(){};
	virtual ~MsgLoginReq(){};
};
//登入响应
class MsgLoginRet : public AbstractMsgLogin
{
public:
	MsgLoginRet(){};
	virtual ~MsgLoginRet(){};
};

//登出消息基类
class AbstractMsgLogout
{
public:
	AbstractMsgLogout(void){};
	virtual ~AbstractMsgLogout(void){};
};
//登出请求
class MsgLogoutReq : public AbstractMsgLogout
{
public:
	MsgLogoutReq(){};
	virtual ~MsgLogoutReq(){};
};
//登出响应
class MsgLogoutRet : public AbstractMsgLogout
{
public:
	MsgLogoutRet(){};
	virtual ~MsgLogoutRet(){};
};
//AbstractFactory类出场,消息构造器(工厂类)基类
class AbstractMsgFactory
{
public:
	AbstractMsgFactory(){}
	virtual ~AbstractMsgFactory(){}

	virtual AbstractMsgLogin* CreateMsgLogin() = 0;
	virtual AbstractMsgLogout* CreateMsgLogout() = 0;

};
//请求消息构造器
class ReqMsgFactory : public AbstractMsgFactory
{
public:
	ReqMsgFactory(){};
	virtual ~ReqMsgFactory(){};

	virtual AbstractMsgLogin* CreateMsgLogin();
	virtual AbstractMsgLogout* CreateMsgLogout();
};
//响应消息构造器
class RetMsgFactory	: public AbstractMsgFactory
{
public:
	RetMsgFactory(){};
	virtual ~RetMsgFactory(){};

	virtual AbstractMsgLogin* CreateMsgLogin();
	virtual AbstractMsgLogout* CreateMsgLogout();
};

AbstractMsgLogin* ReqMsgFactory::CreateMsgLogin(){ return new MsgLoginReq();}
AbstractMsgLogout* ReqMsgFactory::CreateMsgLogout(){ return new MsgLogoutReq();}

AbstractMsgLogin* RetMsgFactory::CreateMsgLogin(){ return new MsgLoginRet();}
AbstractMsgLogout* RetMsgFactory::CreateMsgLogout(){ return new MsgLogoutRet();}

#endif // __ABSTRACTFACTORY_H__

上文代码之类关系图

以下是试用代码,这里才能清楚一些:

	ReqMsgFactory* pReqMsgFactory = new ReqMsgFactory;
	AbstractMsgLogin*   pMsgLoginReq   = pReqMsgFactory->CreateMsgLogin();
	AbstractMsgLogout*  pMsgLogoutReq  = pReqMsgFactory->CreateMsgLogout();

	RetMsgFactory*      pRetMsgFactory = new RetMsgFactory;
	AbstractMsgLogin*   pMsgLoginRet   = pReqMsgFactory->CreateMsgLogin();
	AbstractMsgLogout*  pMsgLogoutRet  = pReqMsgFactory->CreateMsgLogout();

OK,到目前为止,我有两个消息构造器,一个构造请求消息,一个构造响应消息。以此类推下去,我在构造器的工厂类中定义很多消息的构造方法类似于CreateMsgXXX()。

以下摘录《设计模式:可复用面向对象软件的基础》关于AbstractFactory的文字:

工厂(Factory)和产品(Product)是Abstract Factory (3.1) 模式的主要参与者。该模式描述了怎样在不直接实例化类的情况下创建一系列相关的产品对象。它最适用于产品对象的数目和种类不变,而具体产品系列之间存在不同的情况。我们通过实例化一个特定的具体工厂对象来选择产品系列,并且以后一直使用该工厂生产产品对象。我们也能够通过用一个不同的具体工厂实例来替换原来的工厂对象以改变整个产品系列。抽象工厂模式对产品系列的强调使它区别于其他只与一种产品对象有关的创建性模式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值