设计模式(十)建造者模式(Builder)

参考书籍:《设计模式 - 可复用面向对象软件的基础》GoF
参考链接: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.扩展/补充
建造者模式和工厂模式:
这两个模式非常相似呀,但是记住一点。建造者模式最主要功能是基本方法的调用顺序安排,也就是这些基本方法已经实现了;而工厂方法则重点是创建,你要什么对象我创造一个对象出来,组装顺序则不是他关心的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值