本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言
构造者模式也是属于我们常用的设计的一种,比如我们在使用使用 StringBuilder、Retrofit、OkHttp 等,都使用了构造者模式,所以我认为构造者模式是工程师必须掌握的,不仅有助于我们看懂别人的代码,也有助于我们编写出高质量的代码。
什么是构造者模式
构造者模式又叫生成器模式, 构造者模式是将一个复杂对象构建和它的表示相分离,使得同样的构造过程可以创建出不同的对象。
也就是说我们只需要定义我们想要的对象的属性,最终就可以得到我们想要的对象,而不用去关心内部是怎么构建对象的。
常规的构造者模式有下面四个角色组成:
- Builder 构造对象的抽象,为创建一个产品 Product 的各个部件指定抽象
- ConcreteBuilder Builder 抽象的具体实现实现,负责实现各个部件的具体构造和装配方法
- Product 被构建的具体产品对象,其中包含多个部件
- Director 指挥者或者叫做导演类,负责安排复杂对象的构造次序,指挥者与抽象构造者之间存在关联关系
常用JavaBean赋值方式
这种方式是最常用的创建对象的方法。只需要使用无参构造函数,然后为每个成员变量设置setter方法。比如有一个User类
User user = new User();
user.setName("大乐");
user.setQQ("12345678");
user.setEmail("12345678@qq.com");
user.setWork("click");
这种只有几个字段的还好,如果这个类有十多个字段甚至更多的时候,就很难受了。 这种方式非常普遍,但是存在一个很明显的问题,对于某个Bean我们可以在任何场景,任何边界之外进行set的操作,这样就显得非常难以管理了,也不符合我们领域化设计的思想
Builder模式赋值
我们需要在目标对象内部创建了一个静态类,通常简单地称为Builder。Builder声明了一系列方法来设置对象属性的值,然后将其返回Builder本身,完成所有调用后,我们调用Builder的无参build方法进行目标对象的初始化。
上述的user赋值就可以这样赋值
User user = User.builder()
.name("大乐")
.qq("12345678")
.email("12345678@qq.com")
.work("click")
.build();
链式结构写法比传统写法要优雅,而且减少了冗余代码,当然这需要lombok中的@Builder注解
@Builder
public class User{
}