您的位置:首页 > 其它

(九)建造者模式

2016-02-17 17:07 225 查看
描述:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。[DP]

我的理解,比如建造一个产品,有一些必要的部分组成,如自行车有前后两个轮子和车架,那么不论我生产山地车,还是公路车都需要建造这些部分,只是表示形式不同而已,那么可以把建造前后轮子和车架的接口抽象出来,然后定义山地车和公路车两种类作为生产线,而总经理只需要关心,我要造什么特种自行车就行了,具体的建造细节交给两种生产线自行处理,同时不会出现少造了轮子的情况,以为抽象类定义了需要建造的部分,必须在子类中实现。

UML图:



代码示例:

// Builder.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <memory>
#include <list>
#include <string>

using namespace std;

class Product
{
public:
void Add(const string &str)
{
parts.push_back(str);
}
//展示创建的产品
void Show()
{
cout << "\n 产品创建 ---" << endl;
auto it = parts.cbegin();
for (; it != parts.cend(); ++it)
{
cout << *it;
}
}
private:
list<string> parts;
};

class Builder
{
public:
virtual ~Builder(){}

virtual void BuildPartA() = 0;
virtual void BuildPartB() = 0;
//获得构建的产品
virtual Product Getresult() = 0;

};

class ConcreteBuilder1 : public Builder
{
public:
void BuildPartA()
{
product.Add("部件A ");
}
void BuildPartB()
{
product.Add("部件B");
}
Product Getresult()
{
return product;
}
private:
Product product;
};

class ConcreteBuilder2 : public Builder
{
public:
void BuildPartA()
{
product.Add("部件 X ");
}
void BuildPartB()
{
product.Add("部件 Y\n");
}
Product Getresult()
{
return product;
}
private:
Product product;
};

class Director
{
public:
static void Construct(Builder * builder)
{
builder->BuildPartA();
builder->BuildPartB();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Builder * b1 = new ConcreteBuilder1;
Builder * b2 = new ConcreteBuilder2;

Director::Construct(b1);
Product p1 = b1->Getresult();
p1.Show();

Director::Construct(b2);
Product p2 = b2->Getresult();
p2.Show();

return 0;
}


输出:



上面的源码中的Director是为指挥建造过程。用户需要什么样的产品,直接传给指挥者就可以了,这样避免了用户接触建造产品组件的接口函数,减少了耦合。

建造者模式适用的场景;

当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。(好好理解一下吧~~~)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: