1. 建造者模式,将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示。
用户只需要指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了。
关键类Director,用它来控制建造过程,用它来隔离用户与建造过程的关联。
适用场合主要是用于创建一些复杂的对象, 这些对象内部的构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
在创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式适用的模式。
建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。代码如下:
原书中变量定义基本采用:类型 变量=new 类()模式,是因为这是c#语言要求,还是有什么深层次目的呢???求解答!!
例如: Product *product = new Product();
而本程序基本采用:Product product;
实现效果是一样的。
// designpattern9_builder.cpp : 定义控制台应用程序的入口点。
//建造者模式
#include "stdafx.h"
#include<vector>
#include<list>
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
class Product
{
list<string> parts ;
public:
void Add(string part)
{
parts.push_back(part);
}
void Show()
{
cout << "\n产品 创建-----";
//for (auto ite = parts->begin(); ite != parts->end(); ite++)
//printf("%d,%s\n", parts->size(),*ite);
for (list<string>::iterator i = parts.begin(); i != parts.end(); i++)
cout << "part: " << *i << endl;
}
};
class Builder
{
public:
virtual void BuildPartA() = 0;
//{
// product->Add("部件Aerror");
///}
virtual void BuildPartB() = 0;
//{
/// product->Add("部件Berror");
//}
virtual Product GetResult() = 0;
//{ return *product; }
protected:
Product product ;
};
class ConcreteBuilder1 :public Builder
{
public:
void BuildPartA() override
{
product.Add("部件A");
}
void BuildPartB() override
{
product.Add("部件B");
}
Product GetResult() override
{
return product;
}
};
class ConcreteBuilder2 :public Builder
{
public:
void BuildPartA() override
{
product.Add("部件X");
}
void BuildPartB() override
{
product.Add("部件Y");
}
Product GetResult() override
{
return product;
}
};
class Director
{
public:
void Construct(Builder *builder)
{
builder->BuildPartA();
builder->BuildPartB();
}
};
int main(int arg,char* argv[])
{
Director director ;
ConcreteBuilder1 b1 ;
ConcreteBuilder2 b2;
director.Construct(&b1);
Product p1 = b1.GetResult();
p1.Show();
director.Construct(&b2);
Product p2 = b2.GetResult();
p2.Show();
//delete director;
return 0;
}