java 生成器 设计模式

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 生成器 设计模式

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

  1. java策略设计模式_Java中的策略设计模式

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

  2. java命令模式_Java中的命令设计模式

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

  3. java memento_memento模式_Java中的Memento设计模式-示例教程

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

  4. java观察者设计模式_Java中的观察者设计模式

    java观察者设计模式 在本教程中,我们将讨论Observer设计模式. 观察者模式有两个主要方面- 主题和观察者 . 当我们的系统有多个对象(称为观察者)时 ,将使用一个模式,即依赖于一个特定对象( ...

  5. java 观察者模式示例_Java中的观察者设计模式-示例教程

    java 观察者模式示例 观察者模式是行为设计模式之一 . 当您对对象的状态感兴趣并希望在发生任何更改时得到通知时,观察者设计模式很有用. 在观察者模式中,监视另一个对象状态的对象称为Observer ...

  6. java 模板方法设计模式_Java中的模板方法设计模式

    java 模板方法设计模式 模板方法是一种行为设计模式 ,用于创建方法存根并将某些实现步骤推迟到子类. 模板方法定义了执行算法的步骤,它可以提供默认实现,该实现对于所有或某些子类可能是通用的. 让我们 ...

  7. java责任链设计模式_Java中的责任链设计模式

    java责任链设计模式 在本教程中,我们将学习如何在Java中实现责任链模式. 责任链设计模式涉及到拥有一系列负责处理请求的对象链. 当客户端发送请求时,第一个处理程序将尝试处理该请求. 如果可以处理 ...

  8. java设计模式适配器模式_Java中的适配器设计模式

    java设计模式适配器模式 适配器设计模式是一种结构设计模式 ,可以帮助我们连接到通过不同接口公开相似功能的旧版或第三方代码. 适配器的现实世界是我们用来将USB电缆连接到以太网端口的类比. 在设计一 ...

  9. java 设计模式 示例_Java中的状态设计模式–示例教程

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

最新文章

  1. ui-router中使用ocLazyLoad和resolve
  2. C语言-用gcc指令体验C语言编译过程
  3. java并行体系结构
  4. linux下使用make指令生成程序时提示“XXX is up to date”问题的解决办法
  5. MYSQL查询语句待优化_mysql语句查询优化
  6. 优化委托的 DynamicInvoke
  7. MySQL The JSON Data Type(JSON格式数据)
  8. android自动运行服务,Android开机自启动服务的实现方法
  9. 改写反话技巧_2021考研唐迟阅读技巧总结
  10. 总结oracle10g在Win10上安装时出现的问题及解决方案
  11. flink-metric原理与实战
  12. 2022年3月15日黑马第三天
  13. 开源OceanBase如何与Prometheus与Grafana监控结合
  14. Android 存储相册,Android 相册图片存储
  15. 科技热点周刊|马斯克套现 440 亿;苹果推出数字身份证;Meta 与微软合作;华为捐赠欧拉
  16. XML,HTTP协议
  17. python删除一列数据_python删除txt第一列数据库
  18. 【Python成长之路】Python爬虫 --requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xaf\x8c\xe7\x9)的解决方法
  19. 李宏毅老师《机器学习》课程笔记-2.1模型训练技巧
  20. 职场小记-宜信大数据团队

热门文章

  1. epoll 浅析以及 nio 中的 Selector
  2. Class的 getSuperclass与getGenericSuperclass区别
  3. 《给教师的阅读建议》经典语录
  4. 循环录(输)入 java 课的学生成绩(5个学生),统计分数大于等于 80 分的学生
  5. javaSE基础代码案例
  6. 对数据进行插入操作并且获取主键的值
  7. easyui根据select下拉框内容更新表单内容_Ant Design 4.0 的一些杂事儿 - Select 篇
  8. 本地方法(JNI)——编码签名
  9. oauth 使用令牌_使用OAuth2令牌的安全REST服务
  10. stackoverflow_Stackoverflow的见解:投票最多的是Spring 4问题