构造者设计模式

72 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

构造者模式也是属于我们常用的设计的一种,比如我们在使用使用 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{
}