建造者模式
建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 --百度百科
使用范围:
1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2.当构造过程必须允许被构造的对象有不同表示时。
3.当对象构建过于复杂,并且具有一定的构建顺序的时。
4.当所需要的对象时同一个东西,只是某些特性或者参数不同的时
解决的问题:
- 用户只需要指定一些自己需要的特性,就可以避免繁杂的构建顺序而得到结果,如购买自定义汽车,只需要告知颜色、型号等等即可。
- 得到自我定义的一个对象,而不是类似于工厂模式中千篇一律的对象
具体分析:
大部分人对于一些东西应该都会产生这样的想法:“我真希望我能拥有应该完全自己设计的XXX啊”,比如想要一间按照自己想法而实际的房子、想要自己设计的车子等等,简而言之就是有一种DIY的冲动。而我曾经也梦想过自己设计一种自行车,虽然我还不会骑自行车。。。。。
曾经年少轻狂的我路过一个自行车店,他们店里正在具有一个活动“自己DIY颜色的自行车”,其中活动规则我记得最清晰的一条就是可能免费“对于你所设计的自行车,本店享有所有相关权力,每当你所设计的自行车卖出去一辆,你将可以分到1元”,我参加了,设计了一个全是蓝色的自行车,因为天是蓝色的,骑上这辆车飞驰,是否会感觉自己在飞翔?
最后的结果,我免费得到了一辆自行车 + 一顿大餐,最让我意想不到的是,销售最多的缺失“红绿红”的配色,难道红配绿这么受欢迎吗?
回想过来,这就是建造者模式把,用户只需要提供每个部分的颜色等自己想要的特性,然后告诉老板,最好就可以得到想要的产品,而不用自己去组装自行车。
关于UML图:
当我画出这张图的时候,我觉得和工厂模式很像:
- 将CBicycle想象成产品,而其有很多属性
- CDirector和IBicycleBuild是聚合关系,可以简单的看作是一个东西,只是添加了一个外部调用类,是否可以相当于“factory”
- 实际建造部分继承于IBicycleBuild,是否相当于工厂的派生工厂,只不过是将CBicycle的各种派生具体化成为了每个CBicycleBuild的private数据罢了。
但是慢慢的对“工厂模式”和“建造者模式进行了区分”
相同点:
- 都是同用户的一些选择,来通过第三发加工得到对象
- 将对象的构建和显示进行区分,大大的简化了对象的构建复杂度
不同点:
- “工厂”是一类东西的不同东西,比如车,有各种牌子,并且不同牌子的创建工厂是不同的;而“建造者”是同一个东西的不同特性罢了,比如一个牌子的车子颜色不同等等
- “工厂”创建的是千篇一律的对象;“建造者”是具有自我特性的对象
- “工厂”注重的创建出对象;“建造者”更加倾向于关注每个过程的特性
谈到其拓展性的时候,会很容易的结合UML知道,当拓展的时候,其实就是拓展“实际建造部分”,但是当流程或者内容数据太过复杂的时候,可能导致该部分太过于庞大,反而会影响系统的运行效率,这个时候肯能就倾向于使用“工厂模式”。就如例子中说的:我DIY的车子先是制造了一辆给我,然后通过工厂加工处很多相同的自行车进行售卖。。
// DirectorModeTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <string>
using namespace std;
#define interface struct
class CBicycle
{
private:
string m_strHead;
string m_strMiddle;
string m_strTail;
public:
void setHead(string headStr) { m_strHead = headStr; }
void setMiddle(string middleStr) { m_strMiddle = middleStr; }
void setTail(string tailStr) { m_strTail = tailStr; }
void show() {
cout << "Head is:" << m_strHead << "\n"
<< "Middle is:" << m_strMiddle << "\n"
<< "Tail is:" << m_strTail
<<"\n" << "\n" << endl;
}
};
/
interface IBicycleBuild
{
virtual void assemHead() = 0;
virtual void assemMiddle() = 0;
virtual void assemTail() = 0;
virtual CBicycle getBicycle() = 0;
};
class CBicycleBuildA : public IBicycleBuild
{
private:
CBicycle m_bicycle;
public:
void assemHead()
{
m_bicycle.setHead("head is blue.");
}
void assemMiddle()
{
m_bicycle.setMiddle("middle is blue.");
}
void assemTail()
{
m_bicycle.setTail("taile is blue.");
}
CBicycle getBicycle()
{
return m_bicycle;
}
};
class CBicycleBuildB : public IBicycleBuild
{
private:
CBicycle m_bicycle;
public:
void assemHead()
{
m_bicycle.setHead("head is red.");
}
void assemMiddle()
{
m_bicycle.setMiddle("middle is green.");
}
void assemTail()
{
m_bicycle.setTail("taile is red.");
}
CBicycle getBicycle()
{
return m_bicycle;
}
};
//
class CDirector
{
public:
void createBicycle(IBicycleBuild* bicBuild)
{
bicBuild->assemHead();
bicBuild->assemMiddle();
bicBuild->assemTail();
}
};
int main()
{
CDirector cDirector;
CBicycleBuildA buildA;
CBicycleBuildB buildB;
cDirector.createBicycle(&buildA);
cDirector.createBicycle(&buildB);
buildA.getBicycle().show();
buildB.getBicycle().show();
return 0;
}