设计模式-到底什么是builder模式

4 篇文章 0 订阅

我们来看一个一些常见的开源代码中带builder字样的经典类:

(jdk)Stringbuilder

(spring)springApplicationBuilder

(es)xxxQuerybulider

如果只去看这些类的话,应该是一团乱码,估计总结提取不出来,什么是builder模式。还是从头开始

下图,是一些经典的builder模式的图。能想到,跟上面三个类有啥关系吗?

这些示例图,如果再完善一下的话,大家应该会更清晰。

1,在prouct类中,应该有partA,partB,partC,这三个私有属性。

2,在Concretebuilder类中,应该还有一个返回product实例的方法build():Product。

3,在Concretebuilder类中,这几个buildpart方法,可以没有返回值,但是其实更多的情况是返回了对象本身。以至于,可以连续调用。buildPartA().buildPartB().build()

这样,就跟我们的一些常见类給对上了。

那么builder模式这种方式解决了哪些问题?(即应用场景)

网上的解释,以及书上的解释都很多。尤其是一些架构级别的书中,更是写的让人摸不着头脑。

《系统设计师》一书中,描述一下情况,应该使用builder模式:

“·创建复杂对象的算法独立于组成对象的部分,以及这些部分的集合方式。

·构造过程必须允许已构建对象有不同的表示。”

真心看不懂,但是我的理解就是,一个类中,有多个可选属性的情况,就会造成创建对象的算法很复杂,例如user类中,有name,age,height,sex,address,phone等可选的属性。我们应用程序中要构建这些类,如果通过构造方法的话,可以写太多的构造方法了。User(name,age,height,sex,address,phone),可能有些属性暂时没有或者不需要,少传一些属性,或者交换一些属性排序,就又要提供不同的构造函数。当然,我们是否可以使用set方法呢?也可以,但是基本也是要一大串set方法。

所以我们专门用一个构造类,独立于组成对象的部分,UserBuilder,其中提供.name(String name)方法,.age()方法,height()方法等,都是去初始化部分对象属性,同时返回构造器本身,方便链式调用局部构造方法。最后,使用.build()或者.creatUser()等方法,获取之前生成和局部构造了部分属性的实例。这一部分也表示“允许已构建对象有不同的表示”

那构造器的抽象接口Abstract Bulider和Director类呢?起什么作用呢?

其实在越来越常见的使用中,Abstract Bulider和Director已经被越来越弱化了。因为着两个确实起到的提升整个模式优化的能力并不是那么的明显。你们看一下,其他博客上的写的一些代码示例,什么生产车,生产手机的代码示例,就知道其实Abstract Bulider和Director这两个用途不太大(当然也可能是我自己没有遇到类是的这两个类起很重要作用的场景,如果有读者遇到了,欢迎批评指正)。所以被很多开源方法中,就弱化或者没有再使用Abstract Bulider和Director了,也遇到了其他一些开源代码,好像是使用了director类,但其实又有点四不像,整个模型交互也不太像。所以更常见的反而是阉割版的builder模式吧。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值