建造者模式Builder):

    将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

设计模式-建造者模式_建造者

 

1.将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2.建造者模式又称为生成器模式,可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
3.如果使用了建造者模式,那么用户就只需要制定需要建造的类型就可以得到它们,而具体的细节就不需要知道了。

 

 

介绍上面UML图相关类:

 

Builder:是一个创建小人各个部分的抽象类,概括的说是为创建一个Product对象的各个部件指定的抽象接口。
ConcreteBuilder:具体的小人,具体实现如何画出小人的头身手脚各个部位,它是具体的建造者,实现Builder接口,构造和装配各个部件。
Product:就是那些具体的小人,产品角色。
Director:指挥者,用来根据用户需求构建小人对象,它是构建一个使用Builder接口的对象。


什么时候使用建造者
    它主要是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。建造者模式的好处就是使得建造代码用户表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
实现UML说表示的结构代码:

 

建造者模式代码

 

#pragma once
#include <list>
#include <string>
#include <iostream>
using namespace std;

//Product类-产品类,由多个部件组成。
class CProduct
{
private:
	list<string> m_lsParts;
public:
	CProduct(){m_lsParts.clear();}
	void Add(string strPart)
	{
		m_lsParts.push_back(strPart);
	}
	void Show()
	{
		cout<<"产品创建"<<endl;
		for each(string i in m_lsParts)
		{
			cout<<i<<endl;
		}
	}
};
//Builder类-抽象建造者类,确定产品由两个部件PartA和PartB组成,并声明一个得到产品建造后结果的方法。
class CBuilder
{
public:
	virtual void BuildPartA() = 0;
	virtual void BuildPartB() = 0;
	virtual CProduct* GetResult() = 0;
};

//ConcreteBuilder1类-具体建造者类。
class CConcreteBuilder1 : public CBuilder
{
private:
	CProduct *m_pProduct;
public:
	CConcreteBuilder1(){m_pProduct = new CProduct();}
	~CConcreteBuilder1(){delete m_pProduct;}

	void BuildPartA()
	{
		m_pProduct->Add("部件A");
	}
	void BuildPartB()
	{
		m_pProduct->Add("部件B");
	}
	CProduct* GetResult()
	{
		return m_pProduct;
	}
};

//ConcreteBuilder2类-具体建造者类。
class CConcreteBuilder2 : public CBuilder
{
private:
	CProduct *m_pProduct;
public:
	CConcreteBuilder2(){m_pProduct = new CProduct();}
	~CConcreteBuilder2(){delete m_pProduct;}

	void BuildPartA()
	{
		m_pProduct->Add("部件X");
	}
	void BuildPartB()
	{
		m_pProduct->Add("部件Y");
	}
	CProduct* GetResult()
	{
		return m_pProduct;
	}
};

//Director类-指挥者类。
class CDirector
{
public:
	void Construct(CBuilder *pBuilder)
	{
		pBuilder->BuildPartA();
		pBuilder->BuildPartB();
	}
};


客户端使用代码

 

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

#include "stdafx.h"
#include "Builder.h"
#include <windows.h>

using namespace std;

int main()
{
	CDirector *pDirector = new CDirector();
	CBuilder *pB1 = new CConcreteBuilder1();
	CBuilder *pB2 = new CConcreteBuilder2();
	
	pDirector->Construct(pB1);
	CProduct *p1 = pB1->GetResult();
	p1->Show();

	pDirector->Construct(pB2);
	CProduct *p2 = pB2->GetResult();
	p2->Show();

	delete pDirector ;
	delete pB1 ; delete pB2;
	//delete p1 ; delete p2;


	return 0;
}

运行结果

 

设计模式-建造者模式_ios_02