博客
关于我
【设计模式之禅】建造者模式
阅读量:495 次
发布时间:2019-03-07

本文共 1660 字,大约阅读时间需要 5 分钟。

建造者模式是一种软件设计模式,它允许一个复杂对象的构造过程与其表示相隔离,使得可以通过不同的构造方式创建相同或不同的表示。这种模式特别适用于需要创建不同配置或版本的对象,而这些对象的构造方式和顺序可能会影响最终产物本身。

定义

建造者模式(Builder Pattern)的核心思想是将对象的构建过程封装起来,通过专门的建造者类(Builder)来管理构造步骤。这样一来,不同的建造者可以提供不同的构造逻辑,而产品类本身只需要关注于自身的行为定义,而不必直接参与构造过程。

角色定义

在建造者模式下通常会有以下几个角色:

  • 产品类:这是构造过程最终目标的对象,通常会采用模板方法模式(Template Method Pattern)来定义构造过程中需要执行的基本操作。

  • 抽象建造者:这是一个抽象基类,定义了一个通用的构造流程。它需要知道该如何为产品类添加不同零件或配置。

  • 具体建造者:继承自抽象建造者,并实现了具体的构造步骤。每个具体建造者对应一种不同的构造方式或配置需求。

  • 导演类:这个角色通常由一个或多个类组成,负责协调建造过程,决定使用哪一个具体建造者以及在什么顺序执行其方法。

  • 代码示例

    // 产品类public class Product {    public void doSomething() {        // 假设这是产品类的一些默认逻辑    }}// 抽象建造者public abstract class Builder {    public abstract void setPart(); // 设置产品的不同部分    public abstract Product buildProduct(); // 返回构造完成的产品}// 具体建造者public class ConcreteProduct extends Builder {    private Product product = new Product(); // 初始化产品    public void setPart() {        product.doSomething(); // 假设这是具体的配置步骤    }    public Product buildProduct() {        return product;    }}// 导演类public class Director {    private Builder builder;    public Director(Builder builder) {        this.builder = builder;    }    public Product getProduct() {        builder.setPart();        return builder.buildProduct();    }}

    注意:这里的代码示例仅是部分框架,实际开发中可能会有更多的字段和方法需要实现,具体还要根据实际需求进行调整。

    优点

  • 封装性:通过封装建造过程,避免了高层模块直接操作底层细节。

  • 灵活性:同一个构造过程可以通过不同的建造者生成不同的产品配置。

  • 可扩展性:只需要添加新的具体建造者就能支持新的构造方式,而不需要修改现有的产品类。

  • 应用场景

  • 需要多种构造方式,但公共部分可以被封装:比如在某些框架或工具中,默认提供一种默认构造方式,但可以通过使用不同的建造者来定制构造行为。

  • 需要复杂的构造顺序:比如在某些系统中,某些步骤必须按照特定的顺序执行,以确保最终结果的正确性。

  • 需要支持动态配置:比如在某些日志记录库中,您可以选择通过配置文件或其他方式定义构造器,以便灵活配置日志输出格式。

  • 总结

    通过研究和理解建造者模式,我认为这是一种非常灵活且强大的手段。当需要灵活配置复杂对象的构造方式时,建造者模式可以帮助我们将构造过程与产品表示分离开来,使得两者之间的耦合度降低,从而提升系统的可维护性和扩展性。

    转载地址:http://txtcz.baihongyu.com/

    你可能感兴趣的文章
    PLC通讯方式
    查看>>
    Please install 'webpack-cli' in addition to webpack itself to use the CLI
    查看>>
    Ploly Dash,更新一个Dash应用程序JJJA上的实时人物
    查看>>
    Ploly烛台的定制颜色
    查看>>
    Ploly:如何在Excel中嵌入完全交互的Ploly图形?
    查看>>
    plotloss记录
    查看>>
    Plotly (Python) 子图:填充构面和共享图例
    查看>>
    Plotly 中的行悬停文本
    查看>>
    Plotly 停用 x 轴排序
    查看>>
    Plotly 域变量解释(多图)
    查看>>
    Plotly 绘制表面 3D 未显示
    查看>>
    Plotly-Dash 存在未知问题并创建“加载依赖项时出错“;通过使用 Python-pandas.date_range
    查看>>
    Plotly-Dash:如何过滤具有多个数据框列的仪表板?
    查看>>
    Plotly:如何为 x 轴上的时间序列设置主要刻度线/网格线的值?
    查看>>
    Plotly:如何从 x 轴删除空日期?
    查看>>
    Plotly:如何从单条迹线制作堆积条形图?
    查看>>
    Plotly:如何以 Root 样式绘制直方图,仅显示直方图的轮廓?
    查看>>
    Plotly:如何使用 Plotly Express 组合散点图和线图?
    查看>>
    Plotly:如何使用 plotly.graph_objects 和 plotly.express 定义图形中的颜色?
    查看>>
    Plotly:如何使用 Python 对绘图对象条形图进行颜色编码?
    查看>>