建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。用户只需要指定需要构建的类型就可以得到他们,而具体的建造过程和细节就不需要知道了。
//Product类--产品类,由多个部件组成
class Product
{
private:
vector<string> parts;
public:
//添加产品部件
void Add(string part)
{
parts.push_back(part);
}
void Show()
{
cout << "\n产品 创建 ----" << endl;
for (int i=0; i<parts.size(); ++i)
{
cout << parts[i] << endl;
}
}
};
//Builder类——抽象建造者类,确定产品由两个部件PartA和PartB组成,并声明一个得到产品建造后的方法GetResult
class Builder
{
public:
virtual void BuildPartA() = 0;
virtual void BuildPartB() = 0;
virtual Product* GetResult() = 0;
};
class ConcreteBuilder1 : public Builder
{
private:
Product *pProduct = new Product;
public:
virtual void BuildPartA()
{
pProduct->Add("部件A");
}
virtual void BuildPartB()
{
pProduct->Add("部件B");
}
virtual Product* GetResult()
{
return pProduct;
}
};
class ConcreteBuilder2 : public Builder
{
private:
Product *pProduct = new Product;
public:
virtual void BuildPartA()
{
pProduct->Add("部件X");
}
virtual void BuildPartB()
{
pProduct->Add("部件Y");
}
virtual Product* GetResult()
{
return pProduct;
}
};
//Director类——指挥者类
class Director
{
public:
void Construct(Builder *pBuilder)
{
pBuiler->BuildPartA();
pBuiler->BuildPartB();
}
};
//客户端代码,客户不需要知道具体的建造过程
void main()
{
Director *pDirector = new Director;
Buider *pB1 = new ConcreteBuilder1();
Buider *pB2 = new ConcreteBuilder2();
//指挥者用ConcreteBuiler1的方法来建造产品
pDirector->Construct(pB1);
Product *pP1 = pB1->GetResult();
pP1->Show();
//指挥者用ConcreteBuiler2的方法来建造产品
pDirector->Construct(pB2);
Product *pP2 = pB2->GetResult();
pP2->Show();
}
1.建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方法时适用的模式
2.主要是用于创建一些复杂的对象,这些对象内部构建间的构造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化
3.建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要在定义一个具体的建造者就可以了