Java 当我们可以对setter做同样的事情时,为什么我们需要使用builder设计模式呢?

Java 当我们可以对setter做同样的事情时,为什么我们需要使用builder设计模式呢?,java,design-patterns,Java,Design Patterns,没有必要使用任何模式。您甚至可以通过公开变量来避免设置器。但是, 构建器设计模式的目的是将 从复杂对象的表示构造复杂对象 来源:使用生成器模式有几个优点: 与setter(使类可变)不同,builder可用于构造不可变的对象。在许多情况下,不可变对象优于可变对象,因为它们更易于理解和维护,并且避免了在多线程环境中锁定的需要 构建器可以确保对象满足某些不变量,即使是在构建之后。例如,如果类有一个名称字段,该字段不能为null,则生成器可以检查此条件,如果不满足此条件,则无法构造对象 这两件事您也可

没有必要使用任何模式。您甚至可以通过公开变量来避免设置器。但是,

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


来源:

使用生成器模式有几个优点:

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

  • 构建器可以确保对象满足某些不变量,即使是在构建之后。例如,如果类有一个
    名称
    字段,该字段不能为
    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);
        }
    }