为什么我们需要使用构建器设计模式,而我们可以对 setter 做同样的事情


public class Employee {
    private String name;
    private String address;
    private int id;
    public Employee() {
        // TODO Auto-generated constructor stub
    }
    @Override
    public String toString() {
        return "Employee [name=" + name + ", address=" + address + ", id=" + id + "]";
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
}
public class Main { 
    public static void main(String[] args) {
        Employee e = new Employee();
        e.setName("Priyanka");
        Employee e1 = new Employee();
        e1.setName("Rahul");
        e1.setAddress("Delhi");
        System.out.println("Value of e :"+ e);
        System.out.println("Value of e1:"+ e1);
    }
}

构建器模式可用于:

  • 对用于初始化对象的数据进行一些检查。例如,如果您需要在变量之间进行仔细检查
  • 创建不可变对象。初始化后无法更改对象,因此无法使用资源库
  • 添加代码的可读性。
  • 减少用于初始化对象的代码
  • 使实例处于有效状态。使用资源库,在调用所有资源库之前,对象实例可能处于无效状态。

有关使用构建器创建不可变对象的注意事项。

在多线程环境中工作时,可以在线程之间共享不可变对象,而无需显式同步。由于对象在此期间无法更改,因此不可能有争用条件同时由两个线程访问和修改它。

无需

使用任何模式。您甚至可以通过公开变量来避免二传手。然而

生成器设计模式的目的是将 从其表示构造复杂对象

来源:https://en.wikipedia.org/wiki/Builder_pattern

使用构建器模式有几个优点:

  1. 与 setter(使类可变(不同,生成器可用于构建不可变的对象。在许多情况下,不可变对象优先于可变对象,因为它们更易于理解和维护,并且因为它们避免了在多线程环境中锁定的需要。

  2. 构建器可以确保对象即使在构造后直接满足一些不变量。例如,如果你的类有一个永远不能nullname字段,生成器可以检查这个条件,并在不满足时无法构造对象。

您也可以通过使用将所有类内容作为参数的构造函数来完成这两件事,但是当您的类有多个要初始化的字段时,这将非常不可读。

相关内容

最新更新