当我们可以使用setter进行相同的操作时,为什么需要使用构建器设计模式?

时间:2019-04-18 15:03:03

标签: java design-patterns

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);
    }
}

3 个答案:

答案 0 :(得分:23)

构建器模式可用于:

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

有关使用构建器创建不可变对象的说明。

在多线程环境中工作时,可以在线程之间共享不可变对象,而无需显式同步。因为该对象在这段时间内无法更改,所以无法使竞争条件由两个线程同时访问和修改。

答案 1 :(得分:9)

无需使用任何模式。您甚至可以通过将变量公开来避免设置方法。但是,

  

Builder设计模式的目的是将   根据其表示构造复杂对象

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

答案 2 :(得分:6)

使用构建器模式有一些优点:

  1. 与setter(使您的类可变)不同,可以使用构建器来构造不可变的对象。在许多情况下,不可变对象比可变对象更可取,因为它们易于理解和维护,并且避免了在多线程环境中锁定的需求。

  2. 构建器可以确保即使在构造之后,该对象也可以满足一些不变量。例如,如果您的类具有一个name字段,且永远不能为null,则构建器可以检查此条件,并在不满足要求时无法构造该对象。

通过使用将所有类内容作为参数的构造函数,您也可以完成上述两项操作,但是当您的类具有多个要初始化的字段时,这将非常难以理解。