建造者模式中指挥者类的作用

来源:互联网 发布:南欧四猪 知乎 编辑:程序博客网 时间: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实现的就是一个模板方法模式)。指挥者类,不仅指出了对象的建造顺序,还把用户与建造过程分离,并为可能发生的变化提供了一个灵活的处理方法,使建造顺序的改变或需求的改变不会引起大的改动也不会改变程序的结构。




原创粉丝点击