设计场景:
用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
模板模式特点:
(1)当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式;
(2)最近看的有点绕,不分析了,困了,先睡了,缓缓再整理更新
代码实现:
(1)框架代码
#pragma once
#include<iostream>
#include<string>
#include<vector>
using namespace std;
// 产品类
class Product
{
public:
// 添加产品部件
void add(string part)
{
m_parts.push_back(part);
}
// 列举产品部件
void show()
{
cout << "产品构成:" << endl;
for (int i = 0; i < m_parts.size(); i++)
{
cout << m_parts.at(i) << endl;
}
}
private:
vector<string> m_parts; // 产品部件
};
#pragma once
#include"product.h"
// 建造者类-----抽象
class Builder
{
public:
// 产品由部件 A 和部件 B 构成
virtual void buildPartA() = 0;
virtual void buildPartB() = 0;
// 产品构建结果
virtual Product getResult() = 0;
};
#pragma once
#include"builder.h"
#include"product.h"
// 具体建造者类
class ConcreteBuilderA : public Builder
{
public:
void buildPartA() override
{
m_product.add("部件 a1");
}
void buildPartB() override
{
m_product.add("部件 a2");
}
Product getResult() override
{
return m_product;
}
private:
Product m_product;
};
#pragma once
#include"builder.h"
#include"product.h"
// 具体建造者类
class ConcreteBuilderB : public Builder
{
public:
void buildPartA() override
{
m_product.add("部件 b1");
}
void buildPartB() override
{
m_product.add("部件 b2");
}
Product getResult() override
{
return m_product;
}
private:
Product m_product;
};
#pragma once
#include"builder.h"
// 指挥者类
class Director
{
public:
// 指挥建造过程
void construct(Builder* builder)
{
builder->buildPartA();
builder->buildPartB();
}
};
#include"director.h"
#include"builder.h"
#include"concrete_builder_a.h"
#include"concrete_builder_b.h"
#include"product.h"
int main()
{
// 创建指挥者
Director* director = new Director();
// 创建建造者
Builder* b1 = new ConcreteBuilderA();
Builder* b2 = new ConcreteBuilderB();
// 指挥者使用建造者 A 提供生产线建造产品
director->construct(b1);
Product p1 = b1->getResult();
p1.show();
// 指挥者使用建造者 B 提供生产线建造产品
director->construct(b2);
Product p2 = b2->getResult();
p2.show();
}