创建和销毁对象 - 遇到多个构造器参数是要考虑用构建器

知识点:

构建器 - Builder模式


需要解决的问题:

1.当对象需要多个参数时,怎么样的创建对象

2.在创建对象的基础上要保证代码的可读性

3.在创建对象的基础上除了保证代码的可读性,还要保证创建对象的不可变性(对象不可变性的好处后面会详细讲解)。


1.当对象需要多个参数时,怎么样的创建对象

我们常用的方式,采用多个构造器来创建需要不同参数的对象,这样会有几个问题:我们需要创建多个构造器,用起来也不方便,很容易传递参数的传参错误,有时候还要传递不需要的参数。有一个优点,至少对象是一次创建的,保证了对象的不可变性。


2.在创建对象的基础上要保证代码的可读性

我们想要对象可读性更强一些,经常采用的方式是创建一个空的构造器,其它的参数用setter的方式赋值进来(javaBeans的方式)。这种方式是我们用spring框架的项目使用最多的方式。这个方式会有几个问题:对象不是一次创建成功,对象是后面是可变的,是不安全的,但为什么我们总用这种方式了,是因为spring框架帮我们保证了他的线程安全。如果你没有使用框架保证线程安全,你能保证你赋值还没完成的时候,其它的线程使用这个对象么?额,可读性保证了,但是不能保证不可变性委屈


3.在创建对象的基础上除了保证代码的可读性,还要保证创建对象的不可变性(对象不可变性的好处后面会详细讲解)。

在讲Builder模式之前,我们能自己想办法解决这个问题么?聪明的人已经想到了,我们自己先构造一个对象A,把需要的参数通过setter存放在这个对象A里面,然后把这个对象A来作为需要创建对象B的构造方法的参数,然后对象B就可以一次创建了,问题都解决了,可读性,不可变性。但是有一个问题,这种方式,你的同事,或者你开源包的使用者没法很容易的使用,因为每次创建你的对象B,他们都要先创建一个对象A,没人会用你的代码。如果这个对象A本身就在对象B里面那该多好?

Builder模式来了,看看Builder模式的代码(代码请看书),对象NutritionFacts中有一个静态的Builder对象来保存你的值,Builder本身作为该对象私有构造方法的参数。他解决了所有的问题。


题外话:

模式给我们的思考方式,不要太关注模式的实现方式,不同模式可以用多个语言,多中方式来实现,学会他的思考方式,才能在工作中灵活使用。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值