Java 中的 Builder设计模式是一种创建模式,即用于创建对象,类似于 工厂方法设计模式 ,这也是创建设计模式。 在学习任何设计模式之前,我建议先找出特定设计模式要解决的问题。 众所周知, 必要性是发明的母亲。 在没有面临问题的情况下学习设计模式并不是那么有效,相反,如果您已经面临问题,那么它比起易于理解的设计模式并学习如何解决问题就容易得多。 在本Java设计模式教程中,我们将首先看到 Builder设计模式 解决了 哪些问题 ,这将为 何时使用Java中的 Builder设计模式 提供一些见解 , 这也是一个 流行的设计模式访谈问题 ,然后我们将看到Builder设计模式的示例。在Java中使用Builder模式的利弊。

Builder模式在Java中解决了什么问题

正如我之前所说的, Builder模式是一种创新的设计模式,这意味着它可以解决与对象创建有关的问题。 Java中的构造函数用于创建对象,并且可以采用创建对象所需的参数。 问题开始于可以使用许多参数创建对象时,其中一些参数可能是必需的,而其他参数则是可选的 。 考虑一个用于创建Cake的类,现在您需要一些像鸡蛋,牛奶,面粉这样的项目来创建Cake。 它们中的许多是强制性的,其中一些是可选的,例如Cherry,fruits等。如果我们要针对不同种类的蛋糕重载构造函数 ,则将有许多构造函数,甚至更糟的是,它们将接受许多参数。

问题:

1)要维护的构造函数过多。

2)容易出错,因为许多字段具有相同的类型,例如糖和黄油都放在杯子中,所以如果您传递2杯黄油,则代替2杯糖,编译器不会抱怨,但是会得到几乎没有糖的黄油蛋糕,成本很高浪费黄油。

您可以通过创建Cake并添加成分来部分解决此问题,但这会带来另一个问题,即在构建过程中使Object处于不一致状态 ,理想情况下,在创建Cake之前,该蛋糕不可用。 这两个问题都可以通过使用Java中的Builder设计模式来解决。 Builder设计模式不仅可以提高可读性,而且还可以通过显式添加成分并使对象在完全构建后可用的方式来减少出错的机会。

顺便说一下,Java中已有许多设计模式教程,例如Java中的 Decorator模式教程和Observer模式 。 如果您还没有阅读过,那么值得一读。

Java中的Builder设计模式示例

我们将使用在Java中使用Builder设计模式创建Cake的相同示例。 在这里,我们在Cake中有一个静态的嵌套生成器类 ,用于创建对象。

Java Builder设计模式准则

1)在该类中创建一个名为Builder的静态嵌套类,该类的对象将由Builder生成。 在这个例子中是Cake。

2)Builder类将具有与原始类完全相同的字段集。 3)在本示例中,Builder类将公开添加配料的方法,例如sugar()。 每个方法将返回相同的Builder对象。 每个方法调用都会丰富Builder。

4)Builder.build()方法将所有构建器字段值复制到实际类中并返回Item类的对象。

5)Item类(我们正在为其创建Builder的类)应具有私有构造函数,以通过build()方法创建其对象,并防止外部人员访问其构造函数。

public class BuilderPatternExample {public static void main(String args[]) {//Creating object using Builder pattern in javaCake whiteCake = new Cake.Builder().sugar(1).butter(0.5).  eggs(2).vanila(2).flour(1.5). bakingpowder(0.75).milk(0.5).build();//Cake is ready to eat :)System.out.println(whiteCake);}
}class Cake {private final double sugar;   //cupprivate final double butter;  //cupprivate final int eggs;private final int vanila;     //spoonprivate final double flour;   //cupprivate final double bakingpowder; //spoonprivate final double milk;  //cupprivate final int cherry;public static class Builder {private double sugar;   //cupprivate double butter;  //cupprivate int eggs;private int vanila;     //spoonprivate double flour;   //cupprivate double bakingpowder; //spoonprivate double milk;  //cupprivate int cherry;//builder methods for setting propertypublic Builder sugar(double cup){this.sugar = cup; return this; }public Builder butter(double cup){this.butter = cup; return this; }public Builder eggs(int number){this.eggs = number; return this; }public Builder vanila(int spoon){this.vanila = spoon; return this; }public Builder flour(double cup){this.flour = cup; return this; }public Builder bakingpowder(double spoon){this.sugar = spoon; return this; }public Builder milk(double cup){this.milk = cup; return this; }public Builder cherry(int number){this.cherry = number; return this; }//return fully build objectpublic Cake build() {return new Cake(this);}}//private constructor to enforce object creation through builderprivate Cake(Builder builder) {this.sugar = builder.sugar;this.butter = builder.butter;this.eggs = builder.eggs;this.vanila = builder.vanila;this.flour = builder.flour;this.bakingpowder = builder.bakingpowder;this.milk = builder.milk;this.cherry = builder.cherry;       }@Overridepublic String toString() {return "Cake{" + "sugar=" + sugar + ", butter=" + butter + ", eggs=" + eggs + ", vanila=" + vanila + ", flour=" + flour + ", bakingpowder=" + bakingpowder + ", milk=" + milk + ", cherry=" + cherry + '}';} }

输出:

Cake{sugar=0.75, butter=0.5, eggs=2, vanila=2, flour=1.5, bakingpowder=0.0, milk=0.5, cherry=0}

Java中的生成器设计模式–优点和缺点

充分利用Builder模式也有一些缺点,但是如果您查看下面的内容,优点显然超过了Builder设计模式的缺点。 无论如何,这里都没有使用Java创建对象的Builder设计模式的优缺点。

优点:

1)如果创建对象所需的字段数大于4或5,则更具维护性。

2)不太容易出错,因为由于显式方法调用,用户将知道他们正在传递的内容。
3)更健壮,因为只有完全构造的对象可供客户端使用。

缺点: 1)冗长且代码重复,因为Builder需要从Original或Item类复制所有字段。

何时在Java中使用Builder Design模式? Builder模式是一种创建模式,当构造函数中所需的参数数量通常大于4或最多5时,应使用该模式。不要与Builder和Factory模式混淆。 Builder和Factory模式之间的区别,因为Factory可以用来创建同一接口的不同实现,但是Builder与其Container类绑定在一起,并且仅返回Outer类的对象。

这就是Java中的Builder设计模式 。 我们已经了解了为什么需要构建器模式,解决了什么问题,Java中的构建器设计模式示例以及最终何时使用构建器模式的优缺点。 因此,如果您不使用伸缩构造函数模式,或者选择不使用它,那么可以使用Builder模式。

参考: Java中的构建器设计模式– JCG合作伙伴 Javin Paul在Javarevisited博客上的示例教程 。

翻译自: https://www.javacodegeeks.com/2012/07/builder-design-pattern-in-java.html

Java中的生成器设计模式相关推荐

  1. java 生成器 设计模式_Java中的生成器设计模式

    java 生成器 设计模式 Java 中的 Builder设计模式是一种创建模式,即用于创建对象,类似于 工厂方法设计模式 ,这也是创建设计模式. 在学习任何设计模式之前,我建议先找出特定设计模式要解 ...

  2. 第80节:Java中的MVC设计模式

    第80节:Java中的MVC设计模式 前言 了解java中的mvc模式.复习以及回顾! 事务,设置自动连接提交关闭. setAutoCommit(false); conn.commit(); conn ...

  3. Java中的策略设计模式

    策略设计模式是一种行为模式,其中我们有多种算法/策略来完成一项任务,所使用的算法/策略留给客户选择. 各种算法选项封装在单独的类中. 在本教程中,我们将学习在Java中实现策略设计模式. UML表示形 ...

  4. Java中的命令设计模式

    在本教程中,我们将学习命令模式,这是一种重要的行为设计模式. 它具有一些重要的应用程序,例如在文本编辑器中实现撤消/重做功能. 在命令设计模式中,有一个命令对象位于发送方和接收方对象之间. 发送者对象 ...

  5. Java中的状态设计模式–示例教程

    状态模式是行为设计模式之一 . 当对象根据其内部状态更改其行为时,将使用状态设计模式. 如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用if-else条件块根据状态执行不同的操作. ...

  6. Java中的Memento设计模式-示例教程

    记忆模式是行为设计模式之一 . 当我们要保存对象的状态以便以后可以恢复时,可以使用Memento设计模式. 记忆模式用于以这种方式实现该目的,即在对象外部无法访问该对象的已保存状态数据,从而保护了已保 ...

  7. Java中的访问者设计模式–示例教程

    访客模式是行为设计模式之一 . 当我们必须对一组相似类型的对象执行操作时,将使用访问者模式. 借助访问者模式,我们可以将操作逻辑从对象移动到另一个类. 例如,假设有一个购物车,我们可以在其中添加不同类 ...

  8. Java中的策略设计模式-示例教程

    策略模式是行为设计模式之一 . 当我们对一个特定任务有多种算法,并且客户端决定在运行时使用的实际实现时,将使用策略模式. 策略模式也称为策略模式 . 我们定义了多种算法,并让客户端应用程序将算法用作参 ...

  9. Java中的迭代器设计模式–示例教程

    迭代器模式是一种行为模式,用于提供遍历一组对象的标准方式. Iterator模式在Java Collection Framework中得到了广泛使用,其中Iterator接口提供了遍历集合的方法. 根 ...

最新文章

  1. 有n个学生选修了c语言程序设计这门课程,C语言程序设计报告学生选修课系统(18页)-原创力文档...
  2. 拖动去掉边框的JFrame
  3. 《现代语音信号处理》(胡航著)第1-6章简介
  4. SpringBoot之AOP详解
  5. MTK 驱动(65)---Android 多点触摸协议(Multi-touch Protocol)
  6. ACCESS中执行sql语句
  7. 【golang-GUI开发】struct tags系统(一)
  8. lightoj 1029 最小生成树 + 最大生成树
  9. FastReport产品介绍及免费下载地址
  10. vue3 实现的砸金蛋
  11. 978_使用emacs lisp安装emacs插件
  12. 程序员土豆原创诗四首回顾
  13. 【分享】Python的QQ群
  14. 庆祝自己喜提ROG冰刃3新锐!
  15. 小猪的Python学习之旅 —— 14.项目实战:抓取豆瓣音乐Top 250数据存到Excel中
  16. 【转】phpcms授课学习
  17. java gdal_gdal java环境配置
  18. 23计算机考研22408上岸武汉理工大学经验贴
  19. 微信小程序之蓝牙连接
  20. 开源OA开发平台:合同管理使用手册

热门文章

  1. POJ3278(BFS入门)
  2. 一个会定时执行的方法
  3. 打破双亲委派么,怎么打破_打破了vs你错了
  4. java迭代器删除两个_两个迭代器的故事
  5. 敏捷中gwt含义_在GWT中序列化/反序列化Json
  6. 叉叉框架_叉/连接框架
  7. sts集成jboss_如何为JBoss Developer Studio 8设置集成和SOA工具
  8. 部署gradle_使用Gradle消除开发重新部署
  9. Quarkus的其他(非标准)CDI功能
  10. java 参数命名冲突_Java中的命名参数