Java设计模式Java 杂谈IT@程序员猿媛

Builder设计模式

2019-04-14  本文已影响5人  Coding小聪

概述

Builder模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
其通用类图如下所示:


Builder模式类图
public class Product {   }
public abstract class Builder {    
    //设置产品的不同部分,以获得不同的产品    
    public abstract void setPart();    
    //建造产品    
    public abstract Product buildProduct();
}
public class ConcreteProduct extends Builder {    
    private Product product = new Product();    
    //设置产品零件    
    public void setPart(){       
         /* * 产品类内的逻辑处理 */    
    }    
    //组建一个产品    
    public Product buildProduct() {        
        return product;    
    }
}
public class Director {    
    private Builder builder = new ConcreteProduct();    
    //构建不同的产品    
    public Product getAProduct(){       
        builder.setPart();        
        /** 设置不同的零件,产生不同的产品 */        
        return builder.buildProduct();   
    }
}

应用场景

优雅地创建复杂对象,适用于对通过多个参数构造对象进行重构。

优缺点

优点:

缺点:

源码中的Builder模式

Builder模式的代码自动生成

在Idea中settings-->plugins搜索builder,安装结果中的第一个插件Builder Generator

现有以下Bean对象,我们要为其创建builder对象。

public class PersonDTO {
    private String name;
    private String sex;
    private int age;
    private Date birthday;
    // 省略get/set方法
}

使用快捷键Alt + Insert,在出现的菜单中选择Builder。

如果Builder类只作为内部类,不单独创建,可勾选Inner builder

生成后的代码如下:

public class PersonDTO {
    private String name;
    private String sex;
    private int age;
    private Date birthday;

    public static final class PersonDTOBuilder {
        private String name;
        private String sex;
        private int age;
        private Date birthday;

        private PersonDTOBuilder() {
        }

        public static PersonDTOBuilder aPersonDTO() {
            return new PersonDTOBuilder();
        }

        public PersonDTOBuilder withName(String name) {
            this.name = name;
            return this;
        }

        public PersonDTOBuilder withSex(String sex) {
            this.sex = sex;
            return this;
        }

        public PersonDTOBuilder withAge(int age) {
            this.age = age;
            return this;
        }

        public PersonDTOBuilder withBirthday(Date birthday) {
            this.birthday = birthday;
            return this;
        }

        public PersonDTO build() {
            PersonDTO personDTO = new PersonDTO();
            personDTO.setName(name);
            personDTO.setSex(sex);
            personDTO.setAge(age);
            personDTO.setBirthday(birthday);
            return personDTO;
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读