当前位置: 首页 > article >正文

23种设计模式-生成器(Builder)设计模式

文章目录

  • 一.什么是生成器设计模式?
  • 二.生成器模式的特点
  • 三.生成器模式的结构
  • 四.生成器模式的优缺点
  • 五.生成器模式的 C++ 实现
  • 六.生成器模式的 Java 实现
  • 七.代码解析
  • 八. 总结

类图: 生成器设计模式类图

一.什么是生成器设计模式?

生成器模式(Builder Pattern) 是一种创建型设计模式,允许我们分步骤创建复杂对象,同时提供不同的构建方法来定制对象的各个部分。生成器模式将对象的构建过程与其表示分离,使同样的构建过程可以创建不同的表示。

二.生成器模式的特点

  • 分步骤构建复杂对象:将构建过程分解为多个步骤。
  • 产品结构清晰:对每个组件的创建都有明确的逻辑。
  • 支持多样化配置:生成器可以创建不同的对象或表示。

三.生成器模式的结构

  • Builder(生成器接口):定义构建对象的步骤。
  • ConcreteBuilder(具体生成器):实现生成器接口,完成具体步骤并生成对象。
  • Director(指挥者):控制对象构建的流程和顺序。
  • Product(产品):表示最终创建的复杂对象。
    在这里插入图片描述

四.生成器模式的优缺点

  • 优点:
    • 代码清晰:分离了构造逻辑和产品类,符合单一职责原则。
    • 灵活性强:构造步骤可以灵活调整,支持多样化的产品表示。
    • 可扩展性好:可以轻松增加新的生成器,而不影响已有代码。
  • 缺点:
    • 实现较复杂:需要引入多个类(生成器、指挥者、产品)。
    • 使用场景有限:主要用于构建过程复杂的对象,对于简单对象不适用。

五.生成器模式的 C++ 实现

#include <iostream>
#include <string>
#include <memory>
using namespace std;

// 产品类
class Product {
private:
    string partA;
    string partB;
    string partC;

public:
    void SetPartA(const string& part) { partA = part; }
    void SetPartB(const string& part) { partB = part; }
    void SetPartC(const string& part) { partC = part; }

    void Show() const {
        cout << "Product built with: " << endl;
        cout << "  PartA: " << partA << endl;
        cout << "  PartB: " << partB << endl;
        cout << "  PartC: " << partC << endl;
    }
};

// 抽象生成器
class Builder {
public:
    virtual ~Builder() = default;

    virtual void BuildPartA() = 0;
    virtual void BuildPartB() = 0;
    virtual void BuildPartC() = 0;

    virtual shared_ptr<Product> GetResult() = 0;
};

// 具体生成器
class ConcreteBuilder : public Builder {
private:
    shared_ptr<Product> product;

public:
    ConcreteBuilder() { Reset(); }

    void Reset() { product = make_shared<Product>(); }

    void BuildPartA() override { product->SetPartA("Concrete PartA"); }
    void BuildPartB() override { product->SetPartB("Concrete PartB"); }
    void BuildPartC() override { product->SetPartC("Concrete PartC"); }

    shared_ptr<Product> GetResult() override {
        auto result = product;
        Reset(); // 重置生成器以备下次使用
        return result;
    }
};

// 指挥者
class Director {
private:
    Builder* builder;

public:
    void SetBuilder(Builder* b) { builder = b; }

    void ConstructMinimalProduct() {
        builder->BuildPartA();
    }

    void ConstructFullProduct() {
        builder->BuildPartA();
        builder->BuildPartB();
        builder->BuildPartC();
    }
};

// 客户端代码
int main() {
    ConcreteBuilder builder;
    Director director;

    director.SetBuilder(&builder);

    cout << "Building minimal product:" << endl;
    director.ConstructMinimalProduct();
    auto product1 = builder.GetResult();
    product1->Show();

    cout << "\nBuilding full product:" << endl;
    director.ConstructFullProduct();
    auto product2 = builder.GetResult();
    product2->Show();

    return 0;
}

六.生成器模式的 Java 实现

// 产品类
class Product {
    private String partA;
    private String partB;
    private String partC;

    public void setPartA(String partA) { this.partA = partA; }
    public void setPartB(String partB) { this.partB = partB; }
    public void setPartC(String partC) { this.partC = partC; }

    public void show() {
        System.out.println("Product built with:");
        System.out.println("  PartA: " + partA);
        System.out.println("  PartB: " + partB);
        System.out.println("  PartC: " + partC);
    }
}

// 抽象生成器
interface Builder {
    void buildPartA();
    void buildPartB();
    void buildPartC();
    Product getResult();
}

// 具体生成器
class ConcreteBuilder implements Builder {
    private Product product;

    public ConcreteBuilder() { reset(); }

    private void reset() { product = new Product(); }

    @Override
    public void buildPartA() { product.setPartA("Concrete PartA"); }

    @Override
    public void buildPartB() { product.setPartB("Concrete PartB"); }

    @Override
    public void buildPartC() { product.setPartC("Concrete PartC"); }

    @Override
    public Product getResult() {
        Product result = product;
        reset(); // 重置生成器以备下次使用
        return result;
    }
}

// 指挥者
class Director {
    private Builder builder;

    public void setBuilder(Builder builder) { this.builder = builder; }

    public void constructMinimalProduct() {
        builder.buildPartA();
    }

    public void constructFullProduct() {
        builder.buildPartA();
        builder.buildPartB();
        builder.buildPartC();
    }
}

// 客户端代码
public class BuilderPatternExample {
    public static void main(String[] args) {
        ConcreteBuilder builder = new ConcreteBuilder();
        Director director = new Director();

        director.setBuilder(builder);

        System.out.println("Building minimal product:");
        director.constructMinimalProduct();
        Product product1 = builder.getResult();
        product1.show();

        System.out.println("\nBuilding full product:");
        director.constructFullProduct();
        Product product2 = builder.getResult();
        product2.show();
    }
}

七.代码解析

  • 产品类(Product)
    • 包含产品的各个组成部分(PartA、PartB 和 PartC)。
    • 提供 SetPartX 方法,用于设置对应组件值。
    • 提供 Show 方法,展示产品的状态。
  • 抽象生成器(Builder)
    • 定义了构建产品的各个步骤(BuildPartA、BuildPartB、BuildPartC)。
    • 提供 GetResult 方法,返回构建完成的产品对象。
  • 具体生成器(ConcreteBuilder)
    • 实现抽象生成器接口,提供具体的构建逻辑。
    • 包括一个 Reset 方法,用于每次构建完成后重置状态
  • 指挥者(Director):
    • 控制构建流程,按照特定顺序调用生成器的方法。
    • 提供 ConstructMinimalProduct 和 ConstructFullProduct 方法,分别展示构建简单和完整产品的流程。
  • 客户端代码
    • 创建 ConcreteBuilder 和 Director 对象。
    • 指挥者调用生成器的方法,完成产品构建。
    • 构建完成后,通过 GetResult 获取最终的产品对象,并调用 Show 方法展示产品。

八. 总结

 生成器模式通过分步骤构建复杂对象,解决了构造函数参数过多或对象构建逻辑复杂的问题。它将对象的构造过程与表示分离,使得同样的构造过程可以生成不同的产品。在实现时需要注意保持生成器的灵活性,同时避免产品类与生成器之间的强耦合。
应用场景:

  • 创建复杂对象:对象的构造涉及多个步骤或多个组成部分。
  • 代码复用:将对象的构建逻辑集中到生成器中,避免重复代码。
  • 灵活构建:构建相同类型的对象时,可以通过不同的生成器创建不同的表示。

http://www.kler.cn/a/412689.html

相关文章:

  • C++ 中的函数对象
  • 情绪识别项目
  • WinForm 的Combox下拉框 在FlatStyle.Flat的边框设置
  • 【RISC-V CPU 专栏 -- 香山处理器介绍】
  • 自定义协议
  • linux-FTP服务器配置
  • 解决首次加载数据空指针异常
  • scp比rz sz传文件更好
  • 海康VsionMaster学习笔记(学习工具+思路)
  • faiss库中ivf-sq(ScalarQuantizer,标量量化)代码解读-6
  • C#面向对象,封装、继承、多态、委托与事件实例
  • Linux环境实现c语言编程
  • Linux介绍与安装指南:从入门到精通
  • 【Kubernetes 指南】基础入门——Kubernetes 简介(一)
  • 鸿蒙手势密码
  • Java入门:17.正则表达式,String的intern方法,StringBuilder可变字符串特点与应用,+连接字符串特点--001
  • 循环神经网络(RNN)在自然语言处理(NLP)中的应用
  • MySQL【11】事务
  • 【简单好抄保姆级教学】javascript调用本地exe程序(谷歌,edge,百度,主流浏览器都可以使用....)
  • Git 进程占用报错-解决方案
  • 谷歌浏览器Chrome打开百度很慢,其他网页正常的解决办法,试了很多,找到了适合的
  • STM32 L4系列单片机低功耗模式(STOP模式)
  • 【TQ2440】02 串口连接进入u-boot
  • 【CSP CCF记录】201812-1第15次认证 小明上学
  • leecode56.合并区间
  • 华财术_号卡分销平台讲解(四大运营商+手机卡)