// C++Test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
using namespace std;
//抽象的对象类,只提供具体创建方法的接口,不提供实现
class Builder
{
private:
string m_partA;
string m_partB;
string m_partC;
public:
virtual void BuildPartA() = 0;
virtual void BuildPartB() = 0;
virtual void BuildPartC() = 0;
void SetPartA(string a){m_partA = a;}
void SetPartB(string b){m_partB = b;}
void SetPartC(string c){m_partC = c;}
void Show()
{
cout<BuildPartA();
buider->BuildPartB();
buider->BuildPartC();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
//创建一个具体的Builder
Builder* builder = new ConcreteBuilder();
//创建builderdirector
BuilderDirector* builderdir = new BuilderDirector();
//通过builderdirector来控制创建
builderdir->Build(builder);
//获得结果(不用这一步也可以,经过build之后的builder本身就是已经创建好的对象了)
Builder* result = builder->GetResult();
result->Show();
system("pause");
return 0;
}
结果:
建造者模式主要是对于构建一个包含多个组件的对象,使用相同的构建过程构建不同种类的对象的一种设计模式。
在以下场景中适用建造者模式:
(1)对象由多个不同的组件构成。
(2) 对象的各个组件可能有相互依赖,可能还需要指定构建顺序。
(3) 对象的创建过程独立于创建该对象的类。在建造者模式中通过引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类和客户类中。
(4) 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
适用建造者模式,我们可以不必了解对象内部细节,将对象的创建过程和对象本身解耦,让相同的创建过程可以创建不同的对象。并且,如果我们新增了一种对象,只需要给出具体的ConcreteBuilder即可,复合“开放封闭原则”。将创建过程分成各个部分,而不是单独的一个Init,可以让创建过程更加清晰。
但是使用建造者模式也限制了一些条件,要创建的对象必须有相同的结构,都覆写基类的具体创建过程,并且使用相同的创建顺序。
// C++Test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
using namespace std;
//抽象的对象类,只提供具体创建方法的接口,不提供实现
class Builder
{
private:
string m_partA;
string m_partB;
string m_partC;
public:
virtual void BuildPartA() = 0;
virtual void BuildPartB() = 0;
virtual void BuildPartC() = 0;
void SetPartA(string a){m_partA = a;}
void SetPartB(string b){m_partB = b;}
void SetPartC(string c){m_partC = c;}
//钩子函数,默认是返回true的,如果想控制其为false,只需要在派生类将其覆写即可
virtual bool IsNeedPartA(){return true;}
void Show()
{
cout<IsNeedPartA())
{
buider->BuildPartA();
}
buider->BuildPartB();
buider->BuildPartC();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
//创建一个具体的Builder
Builder* builder = new ConcreteBuilder();
//创建builderdirector
BuilderDirector* builderdir = new BuilderDirector();
//通过builderdirector来控制创建
builderdir->Build(builder);
//获得结果(不用这一步也可以,经过build之后的builder本身就是已经创建好的对象了)
Builder* result = builder->GetResult();
result->Show();
system("pause");
return 0;
}
结果:
bool IsNeedPartA() override
{
return false;
}
// C++Test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
using namespace std;
//抽象的对象类,只提供具体创建方法的接口,不提供实现
class Builder
{
private:
string m_partA;
string m_partB;
string m_partC;
public:
virtual void BuildPartA() = 0;
virtual void BuildPartB() = 0;
virtual void BuildPartC() = 0;
void SetPartA(string a){m_partA = a;}
void SetPartB(string b){m_partB = b;}
void SetPartC(string c){m_partC = c;}
void Show()
{
cout<BuildPartA();
builder->BuildPartB();
builder->BuildPartC();
}
//具体的对象类,实现了具体的创建方法
class ConcreteBuilder : public Builder
{
void BuildPartA() override;
void BuildPartB() override;
void BuildPartC() override;
};
void ConcreteBuilder::BuildPartA()
{
SetPartA("Con1 partA");
}
void ConcreteBuilder::BuildPartB()
{
SetPartB("Con1 partB");
}
void ConcreteBuilder::BuildPartC()
{
SetPartC("Con1 partC");
}
int _tmain(int argc, _TCHAR* argv[])
{
//创建一个具体的Builder
Builder* builder = new ConcreteBuilder();
//通过Builder自带的static方法,构建builder
Builder::CreateBuilder(builder);
//获得结果(不用这一步也可以,经过build之后的builder本身就是已经创建好的对象了)
Builder* result = builder->GetResult();
result->Show();
system("pause");
return 0;
}
结果: