建造者模式(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;
}
运行结果: