知识点:
构建器 - 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本身作为该对象私有构造方法的参数。他解决了所有的问题。
题外话:
模式给我们的思考方式,不要太关注模式的实现方式,不同模式可以用多个语言,多中方式来实现,学会他的思考方式,才能在工作中灵活使用。