参考书籍:《设计模式 - 可复用面向对象软件的基础》GoF
参考链接:http://www.cnblogs.com/jiese/p/3161076.html
目录
1.介绍/作用:
2.应用场景:
3.UML类图
4.实现代码
5.扩展/补充
1.介绍/作用:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式最主要功能是基本方法的调用顺序安排,也就是这些基本方法已经实现了。
2.应用场景:
一是产品类非常的复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式是非常合适。
举一个形象的例子:
去某餐馆就餐,点套餐,每个套餐都包含1个荤菜,1个素材,1碗汤,但是每种套餐具体的菜却不同,所以餐厅更具套餐不同,就分为A,B,C...类,你点餐是只需要点A套餐,就能够获得相应的菜品了。建造者模式就能够做此类事情,根据产品的不同组合及顺序安排来提供接口。
4.实现代码
5.扩展/补充
建造者模式和工厂模式:
这两个模式非常相似呀,但是记住一点。建造者模式最主要功能是基本方法的调用顺序安排,也就是这些基本方法已经实现了;而工厂方法则重点是创建,你要什么对象我创造一个对象出来,组装顺序则不是他关心的。
参考链接:http://www.cnblogs.com/jiese/p/3161076.html
目录
1.介绍/作用:
2.应用场景:
3.UML类图
4.实现代码
5.扩展/补充
1.介绍/作用:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式最主要功能是基本方法的调用顺序安排,也就是这些基本方法已经实现了。
2.应用场景:
一是产品类非常的复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式是非常合适。
举一个形象的例子:
去某餐馆就餐,点套餐,每个套餐都包含1个荤菜,1个素材,1碗汤,但是每种套餐具体的菜却不同,所以餐厅更具套餐不同,就分为A,B,C...类,你点餐是只需要点A套餐,就能够获得相应的菜品了。建造者模式就能够做此类事情,根据产品的不同组合及顺序安排来提供接口。
3.UML类图
4.实现代码
Builder.h
#ifndef _BUILDER_H_
#define _BUILDER_H_
#include <iostream>
using namespace std;
class Builder
{
public:
Builder(){};
virtual ~Builder(){};
virtual void BuildPartA(string) = 0;
virtual void BuildPartB(string) = 0;
virtual void BuildPartC(string) = 0;
private:
};
class ConcreteBuilderA :public Builder
{
public:
ConcreteBuilderA(){};
virtual ~ConcreteBuilderA(){};
virtual void BuildPartA(string str);
virtual void BuildPartB(string str);
virtual void BuildPartC(string str);
private:
};
class ConcreteBuilderB :public Builder
{
public:
ConcreteBuilderB(){};
virtual ~ConcreteBuilderB(){};
virtual void BuildPartA(string str);
virtual void BuildPartB(string str);
virtual void BuildPartC(string str);
private:
};
#endif
Builder.cpp
#include "stdafx.h"
#include "Builder.h"
#include <iostream>
using namespace std;
void ConcreteBuilderA::BuildPartA(string str)
{
cout << "ConcreteBuilderA BuildPartA" << endl;
}
void ConcreteBuilderA::BuildPartB(string str)
{
cout << "ConcreteBuilderA BuildPartB" << endl;
}
void ConcreteBuilderA::BuildPartC(string str)
{
cout << "ConcreteBuilderA BuildPartC" << endl;
}
void ConcreteBuilderB::BuildPartA(string str)
{
cout << "ConcreteBuilderB BuildPartA" << endl;
}
void ConcreteBuilderB::BuildPartB(string str)
{
cout << "ConcreteBuilderB BuildPartB" << endl;
}
void ConcreteBuilderB::BuildPartC(string str)
{
cout << "ConcreteBuilderB BuildPartC" << endl;
}
Director.h
#ifndef _BUILDERDIRECTOR_H_
#define _BUILDERDIRECTOR_H_
#include <iostream>
using namespace std;
#include "Builder.h"
class Direcotr
{
public:
Direcotr(Builder* pBuilder){ this->m_pBuilder = pBuilder; };
~Direcotr(){};
void ConstructA()
{
m_pBuilder->BuildPartA("a");
m_pBuilder->BuildPartB("b");
m_pBuilder->BuildPartC("c");
}
void ConstructB()
{
m_pBuilder->BuildPartB("b");
m_pBuilder->BuildPartA("a");
m_pBuilder->BuildPartC("c");
}
private:
Builder* m_pBuilder;
};
#endif
client代码:
ConcreteBuilderA* pConcreteBuilderA = new ConcreteBuilderA();
Direcotr* pDirecotr = new Direcotr(pConcreteBuilderA);
pDirecotr->ConstructA();
if (pConcreteBuilderA)
{
delete pConcreteBuilderA;
pConcreteBuilderA = nullptr;
}
if (pDirecotr)
{
delete pDirecotr;
pDirecotr = nullptr;
}
输出:
ConcreteBuilderA BuildPartA
ConcreteBuilderA BuildPartB
ConcreteBuilderA BuildPartC
请按任意键继续. . .
5.扩展/补充
建造者模式和工厂模式:
这两个模式非常相似呀,但是记住一点。建造者模式最主要功能是基本方法的调用顺序安排,也就是这些基本方法已经实现了;而工厂方法则重点是创建,你要什么对象我创造一个对象出来,组装顺序则不是他关心的。