java builder设计模式_Java程序员:Java中的Builder设计模式和其使用

设计模式有很多种,本文中,我们将讨论一下Java中的Builder--构建器模式,该模式是一种创建模式,可以拥有用于创建和配置对象。

6726e927bd61290f9cd4b207baea836b.png

为什么需要构建器模式?

假设有一个具有少量实例属性的类,例如下面显示的Employee类。在此类中,某些实例属性是必需的,而其余属性是可选的。你应该为这样一个类写什么样的构造函数?可以创建多个,例如一个只接受所需属性作为参数的构造函数,一个获取所有必需属性加上第一个可选属性,另一个获取两个可选属性,依此类推(这称为telescoping构造函数模式) 。代码如下所示:

ad44ece9cdf39f61281ad4be01ee906e.png

作为开发人员,我们为客户提供了一个从Employee类构造对象的解决方案 。但是,客户可能会为我们提出一系列问题,包括:

我应该调用哪个构造函数?一个有四个参数或一个有五个或六个?如果我没有为每个参数传递值,那么这些可选参数的默认值是多少?如果我只想为邮件和电话传递值,而不是为地址传递值,我该如何满足此要求?如果我错误地将用于地址的值传递给邮件会发生什么?

ce819130217a46b90a044b27d1da7cb1.png

您可能认为JavaBean模式是上述问题的第二种替代解决方案。在JavaBeans模式中,我们调用no-arg构造函数来创建一个对象,然后在该对象上调用setter方法来设置每个必需参数值和您感兴趣的每个可选参数(如下所示)。毫不奇怪,JavaBean模式增加了代码的可读性和对象构造的灵活性。但是,这个解决方案有两大缺点:第一个是对象状态不一致,除非明确设置所有属性; 第二个是JavaBean模式使类可变,并且需要开发人员的额外努力来确保线程安全。

740b5292bbd16f38c64d71cba7556b0f.png

现在我们来看第三种替代解决方案:Builder 模式,构建器模式利用了伸缩构造函数模式的安全性和JavaBean模式的可读性。

什么是Builder模式?

首先,让我们看看如何实现构建器设计模式。

首先,您需要创建一个公共静态嵌套类,它具有外部类的所有实例属性。Builder的命名约定通常是,如果类名是Employee,则构建器类应命名为 EmployeeBuilder。外部类 Employee 应该有一个私有构造函数,它以 EmployeeBuilder 对象作为参数。

991659db41dca1efb1a4945270602711.png

构建器类应该有一个公共构造函数,其中包含所有必需属性作为参数,这些必需属性定义为“final”,它们具有用于设置可选参数的setter方法,它应该在设置可选属性后返回相同的Builder对象。最后一步是build(),在构建器类中提供一个方法,该方法将外部类对象返回给客户端。此 build()方法将调用外部类中的私有构造函数,将Builder对象本身作为参数传递给此私有构造函数。

150915827bd13582cfcf6b4f22adb13b.png

本 Employee类只有getter方法而没有公共构造函数。因此,获取Employee对象的唯一方法是通过嵌套EmpolyeeBuilder 类。使用Builder模式重新设计的类将如下所示:

de15375399b98c0accebbefeb36a157d.png

dd6ce76b29dd8cafe7f580b171076eed.png

我们可以使用如下方式创建一个Employee类对象:

f355312931b04fe292843fc080273a58.png

总结

虽然使用Builder模式有时会让代码更加容易编写,但它也有自身的缺点,比如比伸缩构造模式的代码更冗长。如果您的类在设计时具有相同类型或可选的多个属性,或者希望向类添加更多参数,则应该考虑构建器模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值