建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。它主要适用于创建一些复杂的对象,这些对象内部构造间的构造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。建造者模式是当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方法时适用的设计模式。
UML图如下:
相关类代码如下:
// Builder.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Product
{
vector<string> parts;
public:
void Add(string part)
{
parts.push_back(part);
}
void Show(void)
{
cout<<"------产品创建------"<<endl;
vector<string>::const_iterator pos;
for(pos=parts.begin();pos!=parts.end();++pos)
{
cout<<*pos<<endl;
}
}
};
class Builder
{
protected:
Product m_product;
public:
virtual void BuildPartA()=0;
virtual void BuildPartB()=0;
Product GetResult(void)
{
return m_product;
}
};
class ConcreteBuilder1:public Builder
{
public:
void BuildPartA()
{
m_product.Add("A");
}
void BuildPartB()
{
m_product.Add("B");
}
};
class ConcreteBuilder2:public Builder
{
public:
void BuildPartA()
{
m_product.Add("X");
}
void BuildPartB()
{
m_product.Add("Y");
}
};
class Director
{
public:
void Construct(Builder &builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
};
int main(int argc, char* argv[])
{
Director director;
ConcreteBuilder1 b1;
ConcreteBuilder2 b2;
director.Construct(b1);
Product prodect=b1.GetResult();
prodect.Show();
director.Construct(b2);
prodect=b2.GetResult();
prodect.Show();
return 0;
}
程序分析:Director是指挥者,他用来控制Product对象的构建过程。Builder提供了构建Product的接口。ConcreteBuilder1、ConcreteBuilder2实现了构建Product的方法。Product的构建方法(m_product.Add(string part))独立于其组成部分(BuildPartA、BuildPartB)以及装配方法(先执行BuildPartA在执行BuildPartB),并且其构建过程(先执行BuildPartA在执行BuildPartB)是稳定的(由Director来控制)。