建造者模式
概念
- 建造者模式(Builder Pattern),将一个复杂对象的构建与它的 表示(变化) 分离,使得 同样的构建过程(稳定) 可以创建不同的表示
GOF的UML图
- Builder(抽象建造者):为创建一个产品对象的步骤提供抽象接口。
- ConcreteBuilder(具体建造者):实现 Builder 的接口,实现该产品的各个步骤的具体实现细节
- Director(指示器):指示ConcreteBuilder完成构建产品的框架步骤(稳定)。
- Product(产品):表示被构造的复杂对象。
那么如何理解这个建造者模式?
假设现在有一个人的类,人的属性有性别、名字、年龄。那么当我们想创建一个人并且赋予他具体的属性,那么我们一般需要分为三步
1.设置性别
2.设置名字
3.设置年龄
这三步可以理解为构造的过程框架(稳定),但是想要实现具体的属性时,比如男性或者女性,具体的实现细节是变化的。
那么我们就可以通过建造者模式实现
1.创建一个抽象建造者,提供实现步骤的接口(稳定)
2.派生出具体的建造者,比如女性建造者、男性建造者。通过虚函数重写,实现具体的实现细节(变化)
3.创建一个指示器,实现具体的构建框架(稳定),需要将具体的建造者传入指示器,建造者就会按照指示器的构造框架创建出对应的对象。
优缺点
优点:
- 使用建造者模式可以使客户端不必知道产品内部组成的细节。
- 建造者独立,易于扩展
- 便于控制细节风险,因为实现的细节是独立开的
缺点:
- 创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
- 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大
适用场景
核心:建造模式中,强调的是固定整体构建的算法,而灵活扩展和切换部件的具体构造和产品装配的方式
- 生成的对象具有复杂的内部结构,且这个结构是稳定的
- 不同配置的构建对象,产生不同结果时。
- 相同的构建过程,不同的执行顺序,产生不同结果时。
具体实例
首先创建一个 人的类,具体性别、名字、年龄等属性
#ifndef _HUMAN_H
#define _HUMAN_H
#include <iostream>
#include <string>
using namespace std;
//人类
class Human
{
public:
Human(){
};
~Human(){
};
void SetSex(string sex){
this->m_sex = sex; }
void SetName(string name){
this-