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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python倒排索引实现_倒排索引原理和实现 - uncle_LLD的个人空间 - OSCHINA - 中文开源技术交流社区...

关于倒排索引搜索引擎通常检索的场景是:给定几个关键词,找出包含关键词的文档。怎么快速找到包含某个关键词的文档就成为搜索的关键。这里我们借助单词——文档矩阵模型,通过这个模型我们可以很方便知道某篇文档包含哪些关键词,某…

Spring RESTful Web服务中的异常处理

1.简介 我们可能已经在Spring中遇到了几种处理RESTful Web服务应用程序中异常的方法。 在本文中,我们将尝试探索可以采取的最佳方法来实现有效的异常处理。 2.问题陈述 让我们创建一个简单的应用程序,该应用程序将在REST URI中标识员工姓名。 如果请求中…

java调python画图_Python Matplotlib plot 绘图

1、绘制x和y点plot()函数用于在图中绘制点(标记)。默认情况下,plot()函数在点到点之间画一条线。该函数具有用于在图中指定点的参数。参数1是一个数组,其中包含x轴上的点。参数2是一个包含y轴上的点的数组。如果需要绘制从(1,3)到(8&#xff…

区块链以信用为基础,所以目前在中国不可行.

还是先整一套规范的含金量高的信用体系再说吧.转载于:https://www.cnblogs.com/diggingdeeply/p/impossible_success_in_china_right_now_bcoz_of_lack_credit.html

java cunstructor_参加JavaScript面试,必须搞懂的问题(推荐)

一. JavaScript中的对象.JavaScript中的Object是一组数据的key-value的集合, 有点类似于Java中的HashMap, 所有这些数据都是Object里的property. 通常情况下, JavaScript中建立一个对象用"new"加上constructor function来实现. 如new Date(), new Object()等.var boo…

jms activemq_带有ActiveMQ的JMS

jms activemq带有ActiveMQ的JMS JMS是Java消息服务的缩写,它提供了一种以松散耦合,灵活的方式集成应用程序的机制。 JMS以存储和转发的方式跨应用程序异步传递数据。 应用程序通过充当中介的MOM(面向消息的中间件)进行通信&#x…

【EMV L2】SDA静态数据认证处理流程

【静态数据认证】 静态数据认证处理过程中,卡片没有执行任何处理,终端执行的处理流程:1、认证中心公钥的获取终端使用卡片上的认证中心公钥索引(PKI)【TAG:8F,Certification Authority Public K…

java取邮箱前缀_java抓取网页或文件中的邮箱号码

java抓取网页或文件中的邮箱号码发布时间:2020-10-18 08:58:32来源:脚本之家阅读:69作者:java大渣渣本文实例为大家分享了java抓取邮箱号码的具体代码,供大家参考,具体内容如下java抓取文件中邮箱号码的具体…

为Twitter4j创建自定义SpringBoot Starter

SpringBoot提供了许多启动器模块来快速启动和运行。 SpringBoot的自动配置机制负责根据各种标准代表我们配置SpringBean。 除了Core Spring Team提供的现成的springboot启动器之外,我们还可以创建自己的启动器模块。 在本文中,我们将研究如何创建自定义…

mac php gd库,mac下安装GD库FreeType

MacBook Pro安装的新系统10.10.3,PHP环境也是默认就有的,GD库在默认情况下也安装过了,但在使用验证码的时候,提示GD库不支持FreeType,这里我们手动安装一下。法一:安装 FreeType前往苹果官方开源支持&#…

php异步查询数据库,php中mysql数据库异步查询实现

问题通常一个web应用的性能瓶颈在数据库。因为,通常情况下php中mysql查询是串行的。也就是说,如果指定两条sql语句时,第二条sql语句会等到第一条sql语句执行完毕再去执行。这个时候,如果执行2条sql语句,每条执行时间为…

java btrace_BTrace:Java开发人员工具箱中的隐藏宝石

java btrace这篇文章是关于BTrace的 ,我正在考虑将其作为Java开发人员的隐藏宝藏。 BTrace是用于Java平台的安全,动态跟踪工具。 BTrace可用于动态跟踪正在运行的Java程序(类似于DTrace,适用于OpenSolaris应用程序和OS&#xff09…

共享文件夹不能访问的问题解决

打开控制面板--管理工具--服务--webclinet,设为自动,启动。重启电脑,搞定!转载于:https://www.cnblogs.com/atlj/p/8481257.html

xampp浏览php出现乱码,dvwa+xampp搭建显示乱码的问题及解决方案

如图,dvwa显示乱码,解决办法有两个:1、方法一是,临时解决办法,也就是每次都得手动修改:利用浏览器的编码修改2、方法二是:永久方案,那就是修改dvwa的配置文件,修改默认编…

HotSpot的-XshowSettings标志的简单性和价值

一个方便的HotSpot JVM标志 ( 选项为Java启动 java )是-XshowSettings选项。 Oracle Java启动器描述页面中对此选项进行了如下描述 : -XshowSettings : category显示设置并继续。 该选项的可能类别参数包括: all显示所…

Python验证码简单实现(数字和大写字母组成的4位验证码)

#数字和英文大写字母的4位随机数 def checkcode(): #def 定义方法 checkcode() 方法名()import random # 导入包checkcode ""string range(0,4)for i in string:current random.randrange(0,3) #randrange随机数 参数1<随机数<参数2if current ! i:temp …

php haystack,haystack(示例代码)

1、haystack简介Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询&#xff0c;使用全文检索的效率更高 )&#xff0c;该框架支持Solr,Elasticsearch,Whoosh, Xapian&#xff0c;搜索引擎它是一个可插拔的后端(很像Django的数据库层)&#xff0c;所以几乎你…

猫眼电影面试经历

面试是昨天上午进行的&#xff0c;因为昨天家里断网了&#xff0c;所以未能及时记录。 昨天的面试进行到了第三面&#xff0c;由于第三面的面试官当天未上班&#xff0c;所以成了回家等通知了。 感觉总体面试过程回答了百分之七十的样子吧&#xff01;一面、二面面试官都不错&a…

fopen php 乱码,如何解决php fgets读取文件乱码的问题

如何解决php fgets读取文件乱码的问题,文件,乱码,简体中文,记事本,页面如何解决php fgets读取文件乱码的问题易采站长站&#xff0c;站长之家为您整理了如何解决php fgets读取文件乱码的问题的相关内容。php fgets乱码的解决办法&#xff1a;首先依次点击“菜单修改->页面属…

一致性哈希算法原理分析及实现

一致性哈希算法常用于负载均衡中要求资源被均匀的分布到所有节点上&#xff0c;并且对资源的请求能快速路由到对应的节点上。具体的举两个场景的例子&#xff1a; 1、MemCache集群&#xff0c;要求存储各种数据均匀的存到集群中的各个节点上&#xff0c;访问这些数据时能快速的…