3.建构者模式(创建型)-灵析社区

菜鸟码转

三、 建造者模式(创建型)

建造者模式是一种创建型的设计模式,它将一个复杂对象的构建过程与其表示分离来使得相同的构建过程可以创建不同的表示。其目的是通过简化复杂对象的构建过程来实现灵活、可扩展和易于维护的代码。

建造者设计模式解决了什么问题

  • 将复杂对象的「创建过程」和「属性赋值」分离:从而使同样的构建过程可以创建不同的表示;
  • 允许调用者分步骤地创建复杂对象,同时隐藏了其创建过程的复杂性。

建造者设计模式的应用场景

建造者模式的典型应用场景包括:

  • 构建复杂对象:如果一个对象需要多个步骤才能完成构建,而且每个步骤都有不同的选项和配置,那么就可以使用建造者模式来简化构建过程;
  • 创建不同的表示:建造者模式可以根据需要创建不同的表示,例如通过选择不同的选项和配置参数来创建不同的对象;
  • 实现可变性:通过使用建造者模式,可以方便地更改一个对象的内部表示方式,而不必修改对象本身。

具体应用上,建造者模式常被用于复杂对象的构建,例如在 Java 中的 StringBuilder 类就使用了建造者模式来构建字符串对象。

示例代码

下面是一个使用建造者模式实现发送邮件的示例代码。首先,定义一个 Mail 类,表示邮件对象,并在其中定义邮件的各个属性:

public class Mail {
  
    private String from;
  
    private String[] to;
  
    private String subject;
    
    private String body;

    public void setFrom(String from) {
        this.from = from;
    }

    public void setTo(String[] to) {
        this.to = to;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public void setBody(String body) {
        this.body = body;
    }

    // 发送邮件的方法
    public void send() {
        System.out.println("发送邮件...");
    }
}

接着,定义一个 MailBuilder 接口,用于构建 Mail 对象。MailBuilder 接口中定义了一系列方法,用于设置邮件的各个属性:

public interface MailBuilder {

    MailBuilder from(String from);

    MailBuilder to(String[] to);
    
    MailBuilder subject(String subject);
    
    MailBuilder body(String body);
    
    Mail build();
    
}

然后,我们可以定义一个具体的 MailBuilder 实现类,例如 SimpleMailBuilder。SimpleMailBuilder 类实现了 MailBuilder 接口,并在其中实现了每个方法:

public class SimpleMailBuilder implements MailBuilder {
  
    private Mail mail = new Mail();

    @Override
    public MailBuilder from(String from) {
        mail.setFrom(from);
        return this;
    }

    @Override
    public MailBuilder to(String[] to) {
        mail.setTo(to);
        return this;
    }

    @Override
    public MailBuilder subject(String subject) {
        mail.setSubject(subject);
        return this;
    }

    @Override
    public MailBuilder body(String body) {
        mail.setBody(body);
        return this;
    }

    @Override
    public Mail build() {
        return mail;
    }
  
}

在 SimpleMailBuilder 类中,我们通过实现 MailBuilder 接口来构建 Mail 对象。在 from()、to()、subject() 和 body() 方法中,我们设置了邮件的各个属性,并在 build 方法中返回一个 Mail 对象。

最后,我们可以使用这些类来创建和发送邮件:

public class MailClient {
  
    public void sendMail() {
        Mail mail = new SimpleMailBuilder()
                .from("sender@example.com")
                .to(new String[] {"recipient1@example.com", "recipient2@example.com"})
                .subject("Test email")
                .body("This is a test email.")
                .build();
        mail.send();
    }
  
}

在 MailClient 类中,我们使用 SimpleMailBuilder 来构建 Mail 对象,并调用 send() 方法来发送邮件。通过使用建造者模式,我们可以灵活地创建不同的邮件对象,并且使得代码更加清晰可读。

Lombok 里的 @Builder 的使用

Lombok 是一个 Java 库,它可以通过注解自动生成一些常用的代码,例如 getter()、setter()、equals() 和 hashCode() 等。其中,@Builder 是 Lombok 提供的一个非常实用的注解,它可以帮助我们快速构建和初始化对象。

  • 使用 @Builder 注解时,需要满足以下几个条件:
  • 类必须是 final 的或者没有非私有的构造函数;
  • 每个属性都必须使用 @NonNull、@Nullable 或者 @Setter 注解进行声明,以便处理可能的空值。
  • 使用 @Builder.Default 注解为属性提供默认值。
  • 使用 @Singular 注解来指定复数形式的属性,并允许逐个添加元素。

下面是一个简单的示例:

import lombok.Builder;
import lombok.Getter;
import lombok.NonNull;

@Getter
@Builder(toBuilder = true)
public class User {
  
    @NonNull 
    private String name;
    
  	@NonNull 
    private String email;
    
  	private int age;
  
    @Builder.Default 
    private boolean active = true;
  
}

在上面的示例中,我们定义了一个 User 类,并使用 @Builder 注解来生成构建器。User 类具有四个属性,分别是 name、email、age 和 active。其中,name 和 email 属性被 @NonNull 注解修饰,表示它们不能为空;active 属性使用了 @Builder.Default 注解,表示默认值为 true。

使用 @Builder 注解后,我们就可以像下面这样创建一个 User 对象:

User user = User.builder()
        .name("Alice")
        .email("alice@example.com")
        .age(25)
        .build();

在创建 User 对象时,我们只需要调用 builder() 方法并逐个设置属性即可。如果要修改已有的 User 对象,可以使用 toBuilder() 方法:

User newUser = user.toBuilder()
        .email("alice.new@example.com")
        .build();

通过使用 @Builder 注解,我们可以快速构建和初始化对象,并且避免了手动编写繁琐的构造函数代码。同时,@Builder 还支持链式调用、嵌套构造器和复数形式的属性,使得代码更加简洁易读。

总结

建造者设计模式是一种创建型的设计模式,它将复杂对象的构建和表示分离开来,通过一步一步地构建一个复杂对象,最终得到一个完整的对象实例。它可以帮助我们更加灵活、可扩展和易于维护地创建复杂对象。

下面是建造者设计模式的几个要点:

  • 定义一个产品类:产品类是需要被构建出来的复杂对象,它包含多个组成部分;
  • 抽象出一个 Builder 接口:Builder 接口用于定义产品构建过程中的各个步骤,以及如何将这些步骤组合起来构建产品;
  • 创建具体的 Builder 实现类:具体的 Builder 实现类用于实现 Builder 接口,并完成产品的具体构建过程。不同的 Builder 实现类可以构建出不同的产品;
  • 客户端代码通过指定 Builder 来构建产品:客户端代码可以根据需要选择不同的 Builder 实现类来构建产品;
  • 使用链式调用(Fluent Interface)方式:在 Builder 接口中定义各个方法时使用返回 this 的方式,可以实现链式调用,使得客户端代码更加简洁易读;
  • 提供默认值:为了方便客户端代码的使用,可以在 Builder 接口中提供一些默认值,使得客户端代码可以只设置必要的参数。

总之,建造者设计模式可以帮助我们更加灵活、可扩展和易于维护地创建复杂对象,尤其适用于那些需要多步骤构建的对象。它能够有效地降低系统的耦合性,提高代码的重用性和可读性,是一种非常实用和常用的设计模式。

阅读量:2022

点赞量:0

收藏量:0