创建型模式之建造者模式

什么是建造者模式

建造者模式(Builder Pattern)是一种创建型设计模式,它可以将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式通常适用于以下场景:

  1. 需要创建一个复杂对象,该对象由多个部分组成,且这些部分的创建过程相对独立。
  2. 需要创建的对象有多个不同的表示,而不同的表示之间可以共享部分相同的构建步骤。

建筑者模式的抽象概念

建造者模式主要包含以下几个角色:

  • 产品(Product):表示被构建的复杂对象,通常包含多个部分。
  • 抽象建造者(Builder):定义了构建产品的抽象方法和获取产品的方法。
  • 具体建造者(Concrete Builder):实现了抽象建造者接口,负责具体的构建过程和组装产品。
  • 指挥者(Director):负责调用具体建造者的方法来构建产品,它不直接与产品交互。

具体的代码样例

下面是一个示例代码,展示了如何使用建造者模式创建一个电脑对象:

#include <iostream>
#include <string>

// 产品类:电脑
class Computer {
public:
    void setCPU(const std::string& cpu) {
        m_cpu = cpu;
    }
    
    void setMemory(const std::string& memory) {
        m_memory = memory;
    }
    
    void setHardDisk(const std::string& hardDisk) {
        m_hardDisk = hardDisk;
    }
    
    void show() {
        std::cout << "CPU: " << m_cpu << std::endl;
        std::cout << "Memory: " << m_memory << std::endl;
        std::cout << "Hard Disk: " << m_hardDisk << std::endl;
    }
    
private:
    std::string m_cpu;
    std::string m_memory;
    std::string m_hardDisk;
};

// 抽象建造者类
class Builder {
public:
    virtual void buildCPU() = 0;
    virtual void buildMemory() = 0;
    virtual void buildHardDisk() = 0;
    virtual Computer* getComputer() = 0;
};

// 具体建造者类:台式机建造者
class DesktopBuilder : public Builder {
public:
    void buildCPU() override {
        m_computer->setCPU("Intel i7");
    }
    
    void buildMemory() override {
        m_computer->setMemory("16GB");
    }
    
    void buildHardDisk() override {
        m_computer->setHardDisk("1TB");
    }
    
    Computer* getComputer() override {
        return m_computer;
    }
    
private:
    Computer* m_computer = new Computer();
};

// 具体建造者类:笔记本建造者
class LaptopBuilder : public Builder {
public:
    void buildCPU() override {
        m_computer->setCPU("Intel i5");
    }
    
    void buildMemory() override {
        m_computer->setMemory("8GB");
    }
    
    void buildHardDisk() override {
        m_computer->setHardDisk("512GB");
    }
    
    Computer* getComputer() override {
        return m_computer;
    }
    
private:
    Computer* m_computer = new Computer();
};

// 指挥者类
class Director {
public:
    void construct(Builder* builder) {
        builder->buildCPU();
        builder->buildMemory();
        builder->buildHardDisk();
    }
};

int main() {
    Director director;
    
    Builder* desktopBuilder = new DesktopBuilder();
    director.construct(desktopBuilder);
    Computer* desktop = desktopBuilder->getComputer();
    desktop->show();
    delete desktopBuilder;
    delete desktop;
    
    Builder* laptopBuilder = new LaptopBuilder();
    director.construct(laptopBuilder);
    Computer* laptop = laptopBuilder->getComputer();
    laptop->show();
    delete laptopBuilder;
    delete laptop;
    
    return 0;
}

在上述示例中,我们定义了产品类 Computer,它包含了三个部分:CPU内存硬盘。然后,我们定义了抽象建造者类 Builder,其中包含了构建产品的抽象方法和获取产品的方法。接着,我们定义了两个具体建造者类 DesktopBuilder 和 LaptopBuilder,它们分别实现了抽象建造者接口,负责具体的构建过程和组装产品。最后,我们定义了指挥者类 Director,它负责调用具体建造者的方法来构建产品。

在客户端代码中,我们首先创建一个指挥者对象,然后创建一个具体建造者对象,并将其传递给指挥者的 construct 方法。指挥者根据具体建造者的实现来调用相应的构建方法,最终得到一个完整的产品对象。我们可以通过具体建造者的 getComputer 方法来获取构建好的产品,并进行后续操作。

总结

建造者模式的核心思想是首先创建一个指挥者对象,然后创建一个具体建造者对象,并将其传递给指挥者的 construct 方法。指挥者根据具体建造者的实现来调用相应的构建方法,最终得到一个完整的产品对象

建造者模式的优点包括将复杂对象的构建过程与其表示分离、提供了更好的封装性和灵活性、可以创建不同表示的对象、易于扩展等。它常用于构建复杂的对象,或者需要创建多个不同表示的对象的场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值