建造者模式中指挥者类的作用
来源:互联网 发布:南欧四猪 知乎 编辑:程序博客网 时间:2024/05/18 18:02
在学习建造者模式时,一直有一个问题想不明白,就是为什么要存在指挥者类。感觉没有指挥者类也完全同样的简单快捷,甚至比没有指挥者类更容易理解。
以下是本人用C++写的一个例子程序:
//Builder.cpp
//运用了建造者模式
#include <iostream>
using namespace std;
class Automobile//抽象汽车类
{
public:
virtual ~Automobile(){cout<<"destruction automobile"<<endl;}
virtual void BuildWheel()=0; //建造车轮
virtual void BuildBody()=0; //建造车身
virtual void BuildVehicle()=0; //建造车壳
protected:
Automobile(){}
};
class Car:public Automobile
{
public:
virtual void BuildWheel()
{
cout<<"build the wheel of car"<<endl;
}
virtual void BuildBody()
{
cout<<"build the body of car"<<endl;
}
virtual void BuildVehicle()
{
cout<<"build the Vechicle of car"<<endl;
}
~Car(){cout<<"destruction car"<<endl;}
};
class Truck:public Automobile
{
public:
virtual void BuildWheel()
{
cout<<"build the wheel of Truck"<<endl;
}
virtual void BuildBody()
{
cout<<"build the body of Truck"<<endl;
}
virtual void BuildVehicle()
{
cout<<"build the Vechicle of Truck"<<endl;
}
~Truck(){cout<<"destruction truck"<<endl;}
};
class Director //指挥者类,指挥车的生产过程
{
public:
Director(Automobile *p):pAm(p){}
void Build()
{
pAm->BuildBody();
pAm->BuildWheel();
pAm->BuildVehicle();
}
private:
Automobile *pAm;
};
int main()
{
Truck *pTk(new Truck);
Director D(pTk);
D.Build();
delete pTk;
system("pause");
return 0;
}
以下是不用指挥者类的实现:
//test.cpp
#include <iostream>
using namespace std;
class Automobile
{
public:
virtual ~Automobile(){cout<<"destruction automobile"<<endl;}
virtual void BuildWheel()=0;
virtual void BuildBody()=0;
virtual void BuildVehicle()=0;
void Build() //把在指挥者中完成的指挥生产的功能在父类中实现
{
BuildBody();
BuildWheel();
BuildVehicle();
}
protected:
Automobile(){}
};
class Car:public Automobile
{
public:
virtual void BuildWheel()
{
cout<<"build the wheel of car"<<endl;
}
virtual void BuildBody()
{
cout<<"build the body of car"<<endl;
}
virtual void BuildVehicle()
{
cout<<"build the Vechicle of car"<<endl;
}
};
class Truck:public Automobile
{
public:
virtual void BuildWheel()
{
cout<<"build the wheel of Truck"<<endl;
}
virtual void BuildBody()
{
cout<<"build the body of Truck"<<endl;
}
virtual void BuildVehicle()
{
cout<<"build the Vechicle of Truck"<<endl;
}
~Truck(){cout<<"destruction truck"<<endl;}
};
int main()
{
{
Truck *pTk(new Truck);
pTk->Build();
delete pTk;
}
system("pause");
return 0;
}
这样一看也没什么不可,那么为什么需要指挥者类呢?一翻思考后......
以下是我的一点思考,小弟初学设计模式,有不对的地方,还望指出。
1、如果子类有很多的话,例如有1000个,那么若不用指挥者类,就有可能带来代码膨涨的问题,因为test.cpp中Automobile类的Build函数有1001份代码。
2、就是当需要改变一个产品的内部表示时,如果不用指挥者类,则需要改变Automobile类中的Build函数,从而违背了开放-封闭原则。而使用指挥者类的建造者模式,则只需要再定义一个具体的建造者就行了。再有甚者,如果一个产品的生产过程不是唯一的,例如,以后科技发展迅速,车子不用轮,但是有人喜欢有轮的车子,有人喜欢没轮的车子,那么就只定义多一个指挥类就行了,而若不用指挥者类,则需要在Automobile类中再添加一个Build函数。灵活就大大下降了。
再来看看建造者模式的表述:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
用了建造者模式,用户只需指定需要建造的类型就可以得到它们,而具体的过程和细节就不需要知道了。而建造者中的一个非常重要的类就是指挥者类,它用来控制建造过程,也用它来隔离用户与建造过程的关联。
个人认为,指挥者类是建造模式的核心和灵魂所在,从上面的例子可以看到,如果缺少指挥者类,那么就不能算是建造者模式了,只能说是定义了一个接口或抽象类,规定了必须实现哪些功能罢了(如果撇开模板方法模式是行为型模式,而建造者模式是创建型模式来谈,上面test.cpp实现的就是一个模板方法模式)。指挥者类,不仅指出了对象的建造顺序,还把用户与建造过程分离,并为可能发生的变化提供了一个灵活的处理方法,使建造顺序的改变或需求的改变不会引起大的改动也不会改变程序的结构。
- 建造者模式中指挥者类的作用
- 建造者模式 指挥者的作用
- 大话设计模式之建造者模式(生成器模式) 建造队与指挥者的纠缠
- C++设计模式——建造者模式(一般模式,省略指挥者、引入钩子)
- 建造者模式的设计
- 建造者模式的实现
- Java建造者模式,Android建造者模式的AlertDialog
- 设计模式之建造者模式(与工厂模式的区别以及JDK中StringBuilder类的应用)
- java的设计模式 建造者模式
- 【有毒的设计模式】建造者模式
- Android的设计模式-建造者模式
- 在Android中探秘建造者模式
- 建造者(生成器)模式-更新中
- Android中建造者模式自定义Dialog
- 在Android中探秘建造者模式
- Android中建造者(builder)模式
- 创建类模式4--建造者模式
- Android的开发之&java23中设计模式------建造者模式
- Android--VideoPlay--视频播放器
- hdu 1064 Financial Management
- hadoop 的HDFS文件系统
- noVNC 源码安装步骤
- HTML5实例:利用HTML5打造noVNC客户端
- 建造者模式中指挥者类的作用
- XMLHttpRequest对象的属性
- 【D3D11游戏编程】学习笔记二:XNAMath之XMVECTOR
- 导入Android工程提示The project was not built since
- c++中的引用
- Android开发之旅:环境搭建及HelloWorld
- 安装MS Soap Toolkit3.0 出现Mscomct2.ocx错误
- dentry_hashtable
- 服务器返回的各种HTTP状态码