菜鸟教程链接:建造者模式
概念
建造者模式针对于实例创建复杂且或包含繁多组合可能性的类,通过设计一个builder对象,讲类的创建过程交由builder来处理,从而将类复杂的实现和其表现抽离开来。这种模式跟工厂模式的区别在于,工厂模式侧重点在于把类的实例化过程与外部隔离,交由工厂类去执行。而建造者模式的侧重点在于将类复杂多样的实例过程作简化。
除了菜鸟教程里面的表示外,还有一种常见的使用场景如下:
对于建造者模式,日常开发中接触最多的便是Lombok这一技术,这一技术很好的扩展了创建对象时具有大量可选参数的场景。比如一个类具有十个成员变量,如果我们希望每一种初始化情况都要有对应的构造方法,那么我们要提供的重载构造方法无疑是无比繁多的;如果我们通过先调用无参构造再通过setter方法赋值,那么就会导致一个类的创建到我们期望状态的过程将不会是一个原子化的过程(即该对象无法直接从无到我们期望的状态,必须经过多个setter的过程),这就会导致该类在多线程状态时可能会有异常发生。
于是我们可以用到builder,作为一个可变参数的容器,具有对应类相同的参数作为成员变量,而类的创建只需要一个包含该容器的方法即可。我们将需要的成员变量传递给builder,而builder会根据我们调用的对应方法将元素赋值给对应的变量,而在最后执行build方法时将自身传递给类去实例化(或者直接去调用其全参构造),在类的构造方法中从builder对象中获取所有的参数去创建自身。即可实现一个原子化过程的可变参数构造器。
优缺点
优点:
1: 参数可变,易独立和扩展
2:简便实例化过程,并实现了其原子化
缺点:
1: 创建对象时需要创建对应的builder对象,增加了性能消耗。
2:当参数不多时,它不值得使用,因为会比重叠构造器更加冗长。
适用场景
初始化过程复杂,或者参数过多的情况
示例代码
可以看一个使用了Lombox的@Builder注解的类生成的class,其内部生成了具有相同成员变量的Builder内部类,而自身仅仅只需要一个全参构造即可实现原子化的所有参数可能。
//
// Source code recreated from a .class file by IntelliJ IDEA
//