创建设计模式 - Builder设计模式

今天我们将研究java中的Builder模式。Builder 设计模式是一种创造性的设计模式,工厂模式抽象工厂模式

目录[ 隐藏 ]

  • 1构建器设计模式
  • 2 Java中的Builder设计模式
    • 2.1 Builder Design Pattern视频教程
    • 2.2 JDK中的Builder设计模式示例

生成器设计模式

当Object包含许多属性时,引入了Builder模式来解决Factory和Abstract Factory设计模式的一些问题。

当Object包含许多属性时,Factory和Abstract Factory设计模式存在三个主要问题。

  1. 从客户端程序传递到Factory类的参数太多,可能容易出错,因为大多数情况下,参数的类型是相同的,而从客户端来说,很难维护参数的顺序。
  2. 一些参数可能是可选的,但在Factory模式中,我们被迫发送所有需要发送为NULL的参数和可选参数。
  3. 如果对象很重并且它的创建很复杂,那么所有这些复杂性将成为Factory类的一部分,这会令人困惑。

我们可以通过提供具有所需参数的构造函数然后使用不同的setter方法来设置可选参数来解决大量参数的问题。这种方法的问题是,除非明确设置所有属性,否则Object状态将不一致

Builder模式通过提供逐步构建对象的方法并提供实际返回最终Object的方法,解决了大量可选参数和不一致状态的问题。

Java中的生成器设计模式

让我们看看如何在java中实现构建器设计模式。

  1. 首先,您需要创建一个静态嵌套类,然后将所有参数从外部类复制到Builder类。我们应该遵循命名约定,如果类名是,Computer那么构建器类应该命名为ComputerBuilder
  2. Java Builder类应该有一个公共构造函数,其中包含所有必需的属性作为参数。
  3. Java Builder类应具有设置可选参数的方法,并且应在设置可选属性后返回相同的Builder对象。
  4. 最后一步是build()在构建器类中提供一个方法,该方法将返回客户端程序所需的Object。为此,我们需要在Class中使用Builder类作为参数的私有构造函数。

下面是示例构建器模式示例代码,其中我们有一个Computer类和ComputerBuilder类来构建它。


package com.journaldev.design.builder;public class Computer {//required parametersprivate String HDD;private String RAM;//optional parametersprivate boolean isGraphicsCardEnabled;private boolean isBluetoothEnabled;public String getHDD() {return HDD;}public String getRAM() {return RAM;}public boolean isGraphicsCardEnabled() {return isGraphicsCardEnabled;}public boolean isBluetoothEnabled() {return isBluetoothEnabled;}private Computer(ComputerBuilder builder) {this.HDD=builder.HDD;this.RAM=builder.RAM;this.isGraphicsCardEnabled=builder.isGraphicsCardEnabled;this.isBluetoothEnabled=builder.isBluetoothEnabled;}//Builder Classpublic static class ComputerBuilder{// required parametersprivate String HDD;private String RAM;// optional parametersprivate boolean isGraphicsCardEnabled;private boolean isBluetoothEnabled;public ComputerBuilder(String hdd, String ram){this.HDD=hdd;this.RAM=ram;}public ComputerBuilder setGraphicsCardEnabled(boolean isGraphicsCardEnabled) {this.isGraphicsCardEnabled = isGraphicsCardEnabled;return this;}public ComputerBuilder setBluetoothEnabled(boolean isBluetoothEnabled) {this.isBluetoothEnabled = isBluetoothEnabled;return this;}public Computer build(){return new Computer(this);}}
}

请注意,Computer类只有getter方法,没有公共构造函数。因此,获取Computer对象的唯一方法是通过ComputerBuilder类。

这是一个构建器模式示例测试程序,显示如何使用Builder类来获取对象。


package com.journaldev.design.test;
import com.journaldev.design.builder.Computer;
public class TestBuilderPattern {public static void main(String[] args) {//Using builder to get the object in a single line of code and //without any inconsistent state or arguments management issues     Computer comp = new Computer.ComputerBuilder("500 GB", "2 GB").setBluetoothEnabled(true).setGraphicsCardEnabled(true).build();}
}

Builder Design Pattern视频教程

最近我上传了一个用于Builder Design Pattern的YouTube视频。我还解释了为什么我认为使用Director类在WikiPedia上定义的构建器模式不是一个非常好的面向对象的方法,以及我们如何使用不同的方法和一个类来实现相同的抽象级别。

请注意,这是我的观点,我觉得设计模式是指导我们,但最终我们必须决定在我们的项目中实现它是否真的有益。我坚信KISS原则。

如果你喜欢这个视频,请分享它,喜欢它并订阅我的频道。如果您认为我错了,或者您有任何意见或反馈,以便我以后可以改进我的视频,请通过此处或YouTube视频页面上的评论告诉我。

JDK中的Builder设计模式示例

Java类中的一些构建器模式示例是;

  • java.lang.StringBuilder#append()(未同步)
  • java.lang.StringBuffer#append()(synchronized)

这就是java中的构建器设计模式的全部内容。

这种实现的Builder设计模式:当类的属性非常多的时候,通过在类中设置一个内部静态类,内部静态类有很多setter方法,每个setter方法都在设置完属性后,返回内部静态类的示例,最后通过build方法,传入设置属性完毕的内部静态类,来实例化这个属性非常多的类。

当然这个只是Builder模式的一种实现,还有另外一种实现,如下图:

在客户端代码中,无须关心产品对象的具体组装过程,只需确定具体建造者的类型即可,建造者模式将复杂对象的构建与对象的表现分离开来,这样使得同样的构建过程可以创建出不同的表现。

……
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
Product product = director.construct();
……

本文所描述的Builder模式,其实和Director/Builder/ConcreteBuilder -> Product本质一样,而且更加简单,通过链式的传递内部静态类对象,实现了灵活的设置参数,分解了实例化复杂多属性类对象的笨拙性,而且通过只通过一个类和对应内部静态类实现复杂类对象的创建,更加高效和灵活,因为Builder模式的本质就是弥补工厂模式在面对创建复杂对象时的不足,以降低复杂性,并灵活地设置属性。

当然,如果正常情况下,只需要默认配置,那么也可以通过Director来对这个链式调用的过程进行封装,对外只需Product product = director.construct() 就得到需要的复杂对象。

转载来源:https://www.journaldev.com/1425/builder-design-pattern-in-java

Builder设计模式的链式调用:https://blog.csdn.net/qn20126816/article/details/79294696

创建设计模式 - Builder设计模式相关推荐

  1. 设计模式-Builder模式

    目录 一个例子(做汤) 人工做汤 机器做汤(使用Builder模式) 优缺点 优点 缺点 Builder模式属于创建型模式. 它是将一个复杂对象的构建过程隐藏起来,让使用者只关系自己要生成什么样的对象 ...

  2. matchers依赖_Hamcrest Matchers,Guava谓词和Builder设计模式

    matchers依赖 通常,在编码时,我们必须处理其中包含数十个字段的一些POJO对象. 很多时候,我们通过一个带有数十个参数的构造函数来初始化这些类,这以任何可能的想象的方式都是可怕的. 除此之外, ...

  3. Hamcrest Matchers,Guava谓词和Builder设计模式

    通常,在编码时,我们必须处理其中包含数十个字段的一些POJO对象. 很多时候,我们通过一个带有数十个参数的构造函数来初始化这些类,这以任何可能的想象的方式都是可怕的. 除此之外,使用这些构造函数的函数 ...

  4. 红橙Darren视频笔记 builder设计模式 navigationbar 导航栏第二版

    1.builder设计模式简介 builder的实际应用的典型案例有AlertDialog和OKHttp 例如 // AlertDialogAlertDialog alertDialog = new ...

  5. 红橙Darren视频笔记 builder设计模式+navigationBar导航条

    思路 套用之前的builder设计模式的思路 Product(NavigationBar)+Builder+Parameter 效果: mainActivity代码 @Overrideprotecte ...

  6. 红橙Darren视频笔记 万能Dialog builder设计模式

    1.Android原生的AlertDialog 我们今天看一下AlertDialog的创建方式以及它使用到的builder设计模式 我们先看看原生Android的AlertDialog创建方式: Al ...

  7. 设计模式--builder 模式

    设计模式–builder 模式 说明 @author JellyfishMIX - github / blog.jellyfishmix.com LICENSE GPL-2.0 本文默认已经知道了 b ...

  8. 【设计模式】设计模式总结 ( 七大设计原则 | 创建型模式 | 结构型模式 | 行为型模式 ) ★★★

    文章目录 一.七大设计原则 1.开闭原则 2.依赖倒置原则 3.单一职责原则 4.接口隔离原则 5.迪米特原则 6.里氏替换原则 7.合成复用原则 二.创建型模式 0.简单工厂模式 ( 不属于 GOF ...

  9. 深入浅出设计模式 ------ Builder(生成器模式)

    一. 定义  将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示. 二. 结构  三. 参与者 Builder : 为创建一个Product对象的各个部件指定抽象接口. Con ...

最新文章

  1. 五一假期将至,机房维护工作要做好
  2. 专栏 | 基于 Jupyter 的特征工程手册:特征选择(二)
  3. 机器学习 | EM 算法原理
  4. Spring Boot Starter 常用列表
  5. Codeforces Round #243 (Div. 2) A~C
  6. python 爬虫应用
  7. Google Cloud资源层级, IAM Identity and Access Management, 控制台云交互
  8. python中使用动量交易策略
  9. html添加桌面背景图片代码,背景图片加文字代码. 用HTML制作表格
  10. 计算机管理员绩效指标,网络管理员绩效kpi考核标准..doc
  11. 禁止查看网页源文件的代码
  12. vue实现搜索框记录搜索历史_Vue 实现输入框新增搜索历史记录功能
  13. Android-NuPlayer音视频同步之安卓Q新功能
  14. 人工智能:通俗易懂理解深度学习与神经网络
  15. 彻底掌握 Commonjs 和 Es Module
  16. html 圆圈图表插件,利用jquery html5实现图表动画圆形饼图
  17. Eclipse MAT 内存分析工具
  18. 解决安卓TV 应用图标不显示的问题
  19. 光流测速和视觉里程计
  20. 配置nginx.conf实现80端口重定向至443(http跳转https)

热门文章

  1. 深入理解CSS权重(优先级)
  2. 滚屏加载--无刷新动态加载数据技术的应用
  3. MySQL常用函数 二
  4. WordPress后台保护插件 Sabre 和 电子商务插件E - commerce GetShopped
  5. Linux(debian7)操作基础(十三)之shell脚本同时执行多个应用程序
  6. 忘记mysql的root密码后,修改密码
  7. SpringBoot—数据库初始化脚本配置
  8. 分组分页连接查询子查询9202-0422
  9. 综合演练 对象数组 对象的方法 我们9203班 0912
  10. qdir安装 多窗口资源管理软件