注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Silence的博客

大师只有一个

 
 
 

日志

 
 

转:创建者模式  

2010-08-26 10:39:57|  分类: 技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

回顾一下第2节中的抽象工厂模式,客户端的代码如下:

//************main.cpp*************
#include <iostream.h>
#include "AbstractFactory.h"

void main()
{
Factory* f=new AFactory();
Salary* s=f->CreateSalary(); //计算工资
s->ComputeSalary();
Insurance* i=f->CreateInsurance(); //计算社会保险
i->ComputeInsurance();
Tax* t=f->CreateTax(); //计算所得税
t->ComputeTax();

f=new BFactory();
s=f->CreateSalary();
s->ComputeSalary();
i=f->CreateInsurance();
i->ComputeInsurance();
t=f->CreateTax();
t->ComputeTax();
}

可以看到,客户端的要组装的东西太多,代码量大,过于臃肿。如果把这些代码放到工厂中去,会使工厂的代码臃肿,同样很麻烦,而且还违背了工厂的原则——工厂只负责创建对象,不负责产品组装。怎么办呢?如果有一个单独的类来负责产品的组装,就可以解决这个问题了——这就是创建者模式。

创建者模式:就是将一个复杂对象的构建与它的表示想分离,使得同样的构建过程可以创建不同的表示,而客户端不知到对象的构建细节。

创建者模式的组成:组装类、抽象创建者类、实现抽象创建者类的具体创建者类、抽象产品类和实现抽象产品类的具体产品类。

转:创建者模式 - Silence - Silence的博客

下面我们用创建者模式实现第2课中的例子。添加一个组装类来负责产品的组装,代码如下:

//************Director.h************
#include "AbstractFactory.h"
class Director //抽象类
{
private:
Factory* f;
public:
Director(Factory* factory) //构造函数
{
   this->f=factory;
}

void Compute() //计算所有
{
   Salary* s=f->CreateSalary(); //计算工资
   s->ComputeSalary();
   Insurance* i=f->CreateInsurance(); //计算社会保险
   i->ComputeInsurance();
   Tax* t=f->CreateTax(); //计算所得税
   t->ComputeTax();
}
};

mian函数(客户端)的代码修改为:

//************main.cpp*************
#include <iostream.h>
#include "Director.h"

void main()
{
//计算子公司A
Director* d=new Director(new AFactory());
d->Compute();
//计算子公司B
d=new Director(new BFactory());
d->Compute();
}

其他代码和第2课的完全一样,这就是结合了抽象工厂模式的创建者模式。可以看到,客户端变得简单多了,产品的组装都由创建者负责,各个类的职责划分更细、更清楚了。

创建者模式的优点:客户不再负责对象的创建和组装,而是把创建的任务交给具体的创建者类,把组装的任务交给组装类,客户只负责对象的调用,从而明确了各个类的职责。

缺点:虽然利用创建者模式可以创建出不同的产品,但是如果产品之间的差异非常大,则需要编写多个创建者类才能实现,这是如果结合工厂模式更好。

  评论这张
 
阅读(680)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017