C++设计模式---建造者模式

建造者模式是一种设计模式,用于隐藏复杂对象的创建过程,通过抽象建造者和具体建造者的继承与重载,动态创建不同表示的复合对象。它将构造与表示分离,使得创建过程可变而构建算法稳定。在代码示例中,展示了如何使用建造者模式组装电脑。建造者模式有封装性好、扩展性好的优点,但也存在产品组件必须相同和维护成本大的缺点。
摘要由CSDN通过智能技术生成

什么是建造者模式

建造者模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。官方说法就是将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。

为什么使用建造者模式

主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

建造者模式实现步骤

1.提供抽象建造者类: 为创建产品各个部分,统一抽象接口

2.提供具体建造者类:具体实现抽象建造者各个部件的接口

3.提供多个具体产品类:具体的创建产品的各个部分

4.提供一个指挥类:负责安排和调度复杂对象的各个建造过程
在这里插入图片描述

建造者模式实现代码

//电脑组装:显示器、鼠标、键盘、主机(主机又包括cpu、显卡、主板等)
//1.找到店铺老板告诉需求
//2.客服安排技术员工组装
//3.产品组装完成
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//电脑组装:显示器、鼠标、键盘、主机(主机又包括cpu、显卡、主板等)
//1.找到店铺老板告诉需求
//2.客服安排技术员工组装
//3.产品组装完成
//抽象产品类
class AbstractProduct 
{
public:
    virtual void SetDisplayer(string displayer) = 0;
    virtual void SetMouse(string mouse) = 0;
    virtual void SetKeyBoard(string keyBoard) = 0;
    virtual void SetHost(string host) = 0;
    virtual void Show() = 0;
};
//具体产品类
class Computer :public AbstractProduct
{
    void SetDisplayer(string displayer)
    {
        m_list.push_back(displayer);
    }
    void SetMouse(string mouse)
    {
        m_list.push_back(mouse);
    }
    void SetKeyBoard(string keyBoard) 
    {
        m_list.push_back(keyBoard);
    }
    void SetHost(string host) 
    {
        m_list.push_back(host);
    }
    void Show() 
    {
        cout << "电脑配置结果:" << endl;
        for (auto v : m_list) 
        {
            cout << v << endl;
        }
    }
    vector<string> m_list;
};
//抽象建造者类
class AbstractBuilder 
{
public:
    AbstractBuilder():product(new Computer) {}
    //抽象构造过程
    virtual void BuildDisplayer(string displayer) = 0;
    virtual void BuildMouse(string mouse) = 0;
    virtual void BuildKeyBoard(string keyBoard) = 0;
    virtual void BuildHost(string host) = 0;
    AbstractProduct* Getproduct() 
    {
        return product;
    }
protected:
    AbstractProduct* product;
};
//具体的建造者类--->组装电脑的技术员
class ConcreteBuilder :public AbstractBuilder 
{
public:
    void BuildDisplayer(string displayer) 
    {
        product->SetDisplayer(displayer);
    }
    void BuildMouse(string mouse) 
    {
        product->SetMouse(mouse);
    }
    void BuildKeyBoard(string keyBoard) 
    {
        product->SetKeyBoard(keyBoard);
    }
    void BuildHost(string host) 
    {
        product->SetHost(host);
    }
};
//指挥者类
class Director 
{
public:
    Director(AbstractBuilder* pBuilder) :pBuilder(pBuilder) {}
    AbstractProduct* createProduct(string displayer, string mouse, string keyBoard, string host) 
    {
        pBuilder->BuildDisplayer(displayer);
        pBuilder->BuildMouse(mouse);
        pBuilder->BuildKeyBoard(keyBoard);
        pBuilder->BuildHost(host);
        return pBuilder->Getproduct();
    }
private:
    AbstractBuilder* pBuilder;
};
​
​
int main() 
{
    AbstractBuilder* pB = new ConcreteBuilder;
    Director* pD = new Director(pB);
    AbstractProduct* computer = pD->createProduct("华为显示器", "牧马人鼠标", "雷蛇键盘", "外星人");
    computer->Show();
    return 0;
}

建造者模式优缺点

优点
1.封装性好,构建和表示分离
2.扩展性好,各个具体的建造者相互独立,有利于系统的解耦
3.控制细节风险,客户端无需详知细节,建造者细化创建过程

缺点
1.产品的组成部分必须相同,这限制了其使用范围
2.产品内部发生变化,建造者需同步修改,后期维护成本较大

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值