Gof23设计模式之建造者模式

2023-10-27

1.概述

建造者模式(Builder Pattern)又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。

  • 建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
  • 一个复杂的构建与其表示(本身)相分离,使得同样的构建过程可以创建不同的表示。现在建造者模式主要用来通过链式调用生成不同的配置。

2.结构

建造者(Builder)模式包含如下角色:

  • 抽象建造者类(Builder):这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的部件对象的创建。

  • 具体建造者类(ConcreteBuilder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供产品的实例。

  • 产品类(Product):要创建的复杂对象。

  • 指挥者类(Director):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

3.例子

//自行车类
public class Bike {
    private String frame;
    private String seat;

    public String getFrame() {
        return frame;
    }

    public void setFrame(String frame) {
        this.frame = frame;
    }

    public String getSeat() {
        return seat;
    }

    public void setSeat(String seat) {
        this.seat = seat;
    }
}

// 抽象 builder 类
public abstract class Builder {

    protected Bike mBike = new Bike();

    public abstract void buildFrame();
    public abstract void buildSeat();
    public abstract Bike createBike();
}

//摩拜单车Builder类
public class MobikeBuilder extends Builder {

    @Override
    public void buildFrame() {
        mBike.setFrame("铝合金车架");
    }

    @Override
    public void buildSeat() {
        mBike.setSeat("真皮车座");
    }

    @Override
    public Bike createBike() {
        return mBike;
    }
}

//ofo单车Builder类
public class OfoBuilder extends Builder {

    @Override
    public void buildFrame() {
        mBike.setFrame("碳纤维车架");
    }

    @Override
    public void buildSeat() {
        mBike.setSeat("橡胶车座");
    }

    @Override
    public Bike createBike() {
        return mBike;
    }
}

//指挥者类
public class Director {
    private Builder mBuilder;

    public Director(Builder builder) {
        mBuilder = builder;
    }

    public Bike construct() {
        mBuilder.buildFrame();
        mBuilder.buildSeat();
        return mBuilder.createBike();
    }
}

//测试类
public class Client {
    public static void main(String[] args) {
        showBike(new OfoBuilder());
        showBike(new MobikeBuilder());
    }
    private static void showBike(Builder builder) {
        Director director = new Director(builder);
        Bike bike = director.construct();
        System.out.println(bike.getFrame());
        System.out.println(bike.getSeat());
    }
}

我们也可以将抽象建造者和指挥者类进行解和,简化系统结构,但不符合开闭原则。

public abstract class Builder {

    // 声明Bike类型的变量,并进行赋值
    protected Bike bike = new Bike();

    public abstract void buildFrame();

    public abstract void buildSeat();

    // 构造自行车方法
    public abstract Bike createBike();

    public Bike construct() {
        this.buildFrame();
        this.buildSeat();
        return this.createBike();
    }
}

4.优缺点

优点:

  • 建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在指挥者类中对整体而言可以取得比较好的稳定性。
  • 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
  • 可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
  • 建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。符合开闭原则。

缺点:

  • 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。

5.使用场景

建造者(Builder)模式创建的是复杂对象,其产品的各个部分经常面临着剧烈的变化,但将它们组合在一起的算法却相对稳定,所以它通常在以下场合使用。

  • 创建的对象较复杂,由多个部件构成,各部件面临着复杂的变化,但构件间的建造顺序是稳定的。
  • 创建复杂对象的算法独立于该对象的组成部分以及它们的装配方式,即产品的构建过程和最终的表示是独立的。

6.扩展方法

/**
 * @author 晓风残月Lx
 * @date 2023/6/26 16:52
 *      手机类
 */
public class Phone {

    private String cpu;
    private String screen;
    private String memory;
    private String mainboard;

    @Override
    public String toString() {
        return "Phone{" +
                "cpu='" + cpu + '\'' +
                ", screen='" + screen + '\'' +
                ", memory='" + memory + '\'' +
                ", mainboard='" + mainboard + '\'' +
                '}';
    }

    // 私有构造方法
    private Phone(Builder builder) {
        this.cpu = builder.cpu;
        this.screen = builder.screen;
        this.memory = builder.memory;
        this.mainboard = builder.mainboard;
    }

    public static final class Builder {
        private String cpu;
        private String screen;
        private String memory;
        private String mainboard;

        public Builder cpu(String cpu) {
            this.cpu = cpu;
            return this;
        }
        public Builder screen(String screen) {
            this.screen = screen;
            return this;
        }
        public Builder memory(String memory) {
            this.memory = memory;
            return this;
        }
        public Builder mainboard(String mainboard) {
            this.mainboard = mainboard;
            return this;
        }

        // 使用构建者创建phone对象
        public Phone build() {
            return new Phone(this);
        }

    }
}
/**
 * @author 晓风残月Lx
 * @date 2023/6/26 16:57
 *      常用的构建者用法  可以提高开发效率
 */
public class Client {
    public static void main(String[] args) {
        // 通过构建者对象创建手机对象
        Phone phone = new Phone.Builder()
                .cpu("intel")
                .screen("三星")
                .memory("金士顿内存条")
                .mainboard("华硕")
                .build();

        System.out.println(phone);
    }
}

在lombok的@Builder注解也能实现建造者模式,简化开发。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gof23设计模式之建造者模式 的相关文章

随机推荐

  • axios解决开发环境跨域问题

    跨域是因为协议域名端口其中一个的不同而产生的的报错 这是浏览器发出的 有些跨域这个时候是已经成功请求了 但是被浏览器拦截了 前端可以配置代理服务器来解决跨域 这个是因为服务器与服务器之间不存在跨域 配置的代理服务器又与本地的协议端口域名都一
  • VLC播放器插件的使用

    div class FlashPlayer style border 0px solid green div
  • golang gen根据数据库生成结构体和数据库操作代码

    package main import fmt gorm io driver mysql gorm io gen gorm io gorm strings testing 此处填入自己对应的ip地址 端口 数据库名称 const Mysql
  • 1.3 手写数字识别任务

    文章目录 横纵式 教学法 一 加载类库 二 数据处理 飞桨API的使用方法 三 模型设计 四 训练配置 五 训练过程 六 模型测试 横纵式 教学法 在本教程中 我们采用了专门为读者设计的创新性的 横纵式 教学法进行深度学习建模介绍 如 图4
  • collection和collections区别

    区别 Collection它是一个集合的接口 它提供了对集合对象进行基本操作的通用接口方法 Collection接口在java类库当中有很多具体的实现 Collection接口的意义就是为各种具体的集合提供最大化的统一操作方式 主要实现的C
  • 软能力那点事,你知多少

    目录 一 软能力是什么 二 软能力 程序猿生存指南 A 沟通能力 B 学习能力 C 时间管理 D 分解能力 E 总结改进 三 程序猿成长路线 1 架构师 2 项目经理 3 产品经理 四 小结 在我们日常工作中 常常会听到软能力这一个词汇 尤
  • “wget: 无法解析主机地址”的解决方法

    问题 root iZ2zefny2a19ms6azli2pwZ wget https download redis io releases redis 5 0 10 tar gz 2020 11 01 14 30 12 https down
  • Jmeter 集合点

    概念 对于性能测试可以理解为多用户并发 但是真正的并发是不存在的 为了更真实的实现并发的概念 我们可以在需要的地方设置集合点 所有虚拟用户都互相之间等一等 然后一起访问 Jmeter集合点是通过添加定时器 Synchronizing tim
  • 针对Failed to execute goal org.apache.maven.pluginsmaven-compiler-plugin3.1的解决方案

    背景 本项目使用JDK1 8 编译maven工程的时候出现如下错误 Failed to execute goal org apache maven plugins maven compiler plugin 3 1 pom中如下配置mave
  • 不同项目中,S7-300 DP 和 S7-1200 PROFINET 的profibus通信(300做主站,1200做从站)

    使用 S7 1200 与 S7 300 的集成 DP 接口进行主从通信 这里是将 S7 300 做为主站 将 S7 1200 做为从站 即 S7 300 集成的 DP 接口做主站 S7 1200 通过 CM1242 5 做从站 两个PLC在
  • Mysql-Galera Cluster

    使用Galera Cluster需要下载包含wsrep补丁的mysql版本 官网下载地址 http galeracluster com downloads 安装前要卸载之前安装的mariadb或者mysql 或者迁移也可以 不过就是另一套操
  • elementui的el-table的插槽功能,添加判断值,在单元格添加输入框,点击事件等等

    elementui的el table的插槽功能 添加判断值 在单元格添加输入框 点击事件等等
  • 三、 HBuilderX运行到手机上看效果

    以下均已录制 点击查看B站视频 1 运行 gt 运行到手机或模拟器 出现如下问题 未检测到手机或模拟器 请稍后重试 2 这时需要手机上做一些设置 设置 gt 关于手机 gt 连续多次点击版本号 就能打开开发者模式 设置 gt 系统和更新 g
  • 优化pxe网启动时tftp的传输速度 --- 针对pxelinux和bootmgr

    作为一名IT人士 一般的计算机维护当然不好意思找别人 于是自己用pxelinux搭了个网络启动环境 可以启动各种WinPE 以供折腾电脑系统 刷新固件的需要 只是一般的网络启动都是基于tftp协议的 传输文件那叫一个慢 启动时光是加载映像文
  • 交易中间件消息中间件_什么是中间件

    交易中间件消息中间件 什么是中间件 What Is Middleware In network architecture a middleware is a layer of software that creates a network
  • 答题小程序常用脚本整理

    答题小程序常用脚本整理 本文主要描述答题活动小程序运营过程中 高频使用的 几个脚本操作 1 如何清理当前题库 在开发控制台的高级操作右侧有个加号按钮 点击下 选择空白模板即可 将下面的脚本复制进去 db collection questio
  • 聚簇索引和二级索引

    原文链接 https blog csdn net jijianshuai article details 79084874
  • SpringCloud项目如何成功打包以及其中的一些坑

    我的项目结构 其中edu online和edu admin是前端项目 其他是后端模块 首先需要在父工程中添加需要打包的模块和打包依赖 如果在父工程中配置过打包依赖则子模块中不需要配置打包依赖 但是如果有子模块需要被其他模块依赖 则需要在被依
  • ROS:解决Error:cannot launch node of type [map_server/map_server]: can't locate node [map_server] in......

    写在前面 本文为原创 如需转载请注明出处 https www jianshu com p e9981bc35cff 欢迎大家留言共同探讨 有误的地方也希望指出 另如果有好的SLAM ROS等相关交流群也希望可以留言给我 在此先谢过了 1 E
  • Gof23设计模式之建造者模式

    1 概述 建造者模式 Builder Pattern 又叫生成器模式 是一种对象构建模式 它可以将复杂对象的建造过程抽象出来 抽象类别 使这个抽象过程的不同实现方法可以构造出不同表现 属性 的对象 建造者模式是一步一步创建一个复杂的对象 它