WHAT
复杂应用:
当一个应用相关的类和对象参数逐步复杂化,数量逐步增加时,这个应用也会伴随着变得复杂。那么对于复杂对象的使用,为了尽可能降低后期维护成本,我们就不能按照传统的简易方式使用。举个例子:如果我们的应用涉及到人,并且是国家级信息,需要记录一个人的所有信息,如全名、工作、薪资、家庭、教育等只要与该人相关的信息都需要记录。由于每个人的阅历背景都是不同的,正式由于这样的多样性,信息的广泛性,造就了人这个对象是极其的复杂。那么采用什么样的方式可以做到每种人能够各取所需呢?今天我们讲的就是提供一个可以解决这类复杂应用的解决方案。
动机:
1、传统构造器的缺点:
①不能很好地扩展大量的可选参数。
②当构造参数不断增加时,按照原来做法得采用众多重载构造函数,构造函数的数量将按照指数级增长,客户端代码会很 难编写,并且仍然难以阅读。
③一长串类型相同的参数会导致一些细微的错误,如果客户端不小心颠倒了两个参数的顺序,编译器不会报错,但是程序 运行时会出错,这给排查错误造成了潜在的成本。
2、为了保证一些特殊情况下,组件的可移植性,预防应用的硬编码行为,造成后期不必要的麻烦。
目的:
1、将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。2、通过使用Builder模式来减少构造函数所需要的参数个数及构造函数的数量。
作用:
1、它使得我们可以改变一个产品的内部表示。 比如原装电脑和组装电脑的区别。2、它将构造代码和表示代码分开。3、它是一步一步的构造产品,并不是一下子就生产产品,它使得你可对构造过程进行更精细的控制。
WHY
解决上述问题方案分析:
1、采用JavaBeans模式,将多个参数转换成实体,通过setter方法来设置每个必要或可选的参数。潜在问题:1、单线程环境下,此做法可行,但是在多线程环境下,在构造过程中JavaBean可能处于不一致的状态。类无法仅仅通过检验构造参数的有效性来保证一致性,因为调试起来也十分困难。2、JavaBeans模式阻止了把类做成不可变的可能,需要程序员付出额外的努力来确保它的线程安全。3、部分错误会在运行时导致错误,因为编译器无法确保程序员会再使用之前先在对象上调用freeze方法。2、为了既能保证重叠构造器模式那样安全性,也能保证像JavaBeans模式那样好的阅读性,也就是Builder模式。不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器,得到一个 builder对象,然后可以通过相关setter方法来设置每个相关的可选参数。最后,通过调用无参的build方法来生成不可变的对象。缺点:1、为了创建对象,必须先创建它的构造器,造成了一些额外的开销,如果在十分注重性能的情况下,可能会有一些影响。2、代码会变得非常的冗长。