在學習建造者模式時,一直有一個問題想不明白,就是為什麼要存在指揮者類。感覺沒有指揮者類也完全同樣的簡單快捷,甚至比沒有指揮者類更容易理解。
以下是本人用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函數。靈活就大大下降了。
再來看看建造者模式的表述:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。主要用於創建一些復雜的對象,這些對象內部構建間的建造順序通常是穩定的,但對象內部的構建通常面臨著復雜的變化。
用了建造者模式,用戶只需指定需要建造的類型就可以得到它們,而具體的過程和細節就不需要知道了。而建造者中的一個非常重要的類就是指揮者類,它用來控制建造過程,也用它來隔離用戶與建造過程的關聯。
個人認為,指揮者類是建造模式的核心和靈魂所在,從上面的例子可以看到,如果缺少指揮者類,那麼就不能算是建造者模式了,只能說是定義了一個接口或抽象類,規定了必須實現哪些功能罷了。指揮者類,不僅指出了對象的建造順序,還把用戶與建造過程分離,並為可能發生的變化提供了一個靈活的處理方法,使建造順序的改變或需求的改變不會引起大的改動也不會改變程序的結構。