Java 当我们可以对setter做同样的事情时,为什么我们需要使用builder设计模式呢?
没有必要使用任何模式。您甚至可以通过公开变量来避免设置器。但是, 构建器设计模式的目的是将 从复杂对象的表示构造复杂对象Java 当我们可以对setter做同样的事情时,为什么我们需要使用builder设计模式呢?,java,design-patterns,Java,Design Patterns,没有必要使用任何模式。您甚至可以通过公开变量来避免设置器。但是, 构建器设计模式的目的是将 从复杂对象的表示构造复杂对象 来源:使用生成器模式有几个优点: 与setter(使类可变)不同,builder可用于构造不可变的对象。在许多情况下,不可变对象优于可变对象,因为它们更易于理解和维护,并且避免了在多线程环境中锁定的需要 构建器可以确保对象满足某些不变量,即使是在构建之后。例如,如果类有一个名称字段,该字段不能为null,则生成器可以检查此条件,如果不满足此条件,则无法构造对象 这两件事您也可
来源:使用生成器模式有几个优点:
名称
字段,该字段不能为null
,则生成器可以检查此条件,如果不满足此条件,则无法构造对象这两件事您也可以通过使用构造函数来完成,该构造函数将所有类内容作为参数,但当您的类有多个字段要初始化时,该构造函数将非常不可读。生成器模式可用于:
- 对用于初始化对象的数据应用一些检查。例如,如果需要在变量之间进行双重检查
- 创建不可变的对象。初始化后无法更改对象,因此不能使用setter
- 增加代码的可读性李>
- 减少用于初始化对象的代码
- 使实例处于有效状态。使用setter,在调用所有setter之前,对象实例可能处于无效状态
有关使用生成器创建不可变对象的说明
在多线程环境中工作时,可以在线程之间共享不可变对象,而无需显式同步。因为对象不能在此期间更改,所以不可能有一个争用条件同时通过两个线程访问和修改它。。。。这更容易使用,因为大多数构建器方法返回对
this
的引用,以允许调用链接。你可以这样写:Employee jonsket=new Employee.Builder()。withName(“Jon”)。withLastname(“Skeet”)。withSalary(1_000_000)。build()
@spi它使代码更易于阅读和调试。这是使用builder设计模式的唯一原因吗?@PriyankaTaneja是唯一一个没有。。。您还可以通过多次调用build()
来构建多个“Jon Skeet”。同样,这似乎是一个次要的优势,但这些小东西放在一起会在easy代码和spaghetti代码之间产生很大的区别。想象一下,您有一个主构造函数,它有10个参数(一个开始的坏主意),并且字段设置为默认值。与使用多个构造函数只设置某些值不同,您可以使用Builder设计模式来设置各种值,而不会造成混淆,同时保留其他值的默认值。此外,它还可以使您不需要临时变量setter,但不能确保您获得的项是有效的。他们不能。建筑工人可以。比方说,如果忘记调用employee.setId()
,则会得到一个属性值为空的对象。而如果执行employeeBuilder.build()
操作,则可能会出现异常,或者只是自动将ID设置为下一个可用的-不应在Employee对象中的逻辑。
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);
}
}