模式概述:

使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。

使用场景:

  1. 使用生成器模式可避免 “重叠构造函数 (telescopic constructor)” 的出现。
  2. 当你希望使用代码创建不同形式的产品 (例如石头或木头房屋) 时, 可使用生成器模式。
  3. 使用生成器构造组合树或其他复杂对象。

代码样例:

代码背景: 假设你要创建一个Person对象,该对象有几十上百的属性,但你的意愿创建的对象可能并不需要其中的很多属性,构造函数会传入很多null;对于构造函数的调用十分不简洁;使用生成器进行创建Persion。

/**
 * 人(复杂对象)
 */
public class Person {
    private String name;
    private int age;
    private double weight;
    private double height;
    private String idCard;
    private String address;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", weight=" + weight +
                ", height=" + height +
                ", idCard='" + idCard + '\'' +
                ", address='" + address + '\'' +
                '}';
    }

	/**
     * Person生成器
     */
    public static class PersonBulider{
        Person p = new Person();

        /**
         * 基础(必要)属性赋值
         */
        public PersonBulider baseInfo(String name,int age){
             = name;
            p.age = age;
            return this;
        }

        /**
         * 体重属性赋值
         */
        public PersonBulider weight(double weight){
            p.weight = weight;
            return  this;
        }

        /**
         * 身高属性赋值
         */
        public PersonBulider height(double height){
            p.height = height;
            return  this;
        }

        /**
         * 身份证属性赋值
         */
        public PersonBulider idCard(String idCard){
            p.idCard = idCard;
            return  this;
        }

        /**
         * 身份证属性赋值
         */
        public PersonBulider address(String address){
            p.address = address;
            return  this;
        }

        public Person bulider(){
            return  p;
        }

    }

}
public class TestBuilder {
    public static void main(String[] args) {
        Person person = new Person.PersonBulider()
                .baseInfo("张三",19)
                .height(180)
                .weight(135)
                .bulider();

        System.out.println(person.toString());
    }
}

测试结果:

java 自动生成实体模型工具 java生成器模式_java 自动生成实体模型工具

补充:
生成器中还有一个”主管“的概念;比如一个品牌汽车进行生产汽车,汽车的型号是固定的几种(汽车型号是一种维度,也可以是其他维度),每种型号的汽车的零件是一致的,换句话说,就是每种型号的汽车构件是固定的(固化的);那么可以创建一个主管类,里面提供各个型号汽车的生产方法,每个型号的生产方法内部是固定当前型号汽车的汽车零件,调用builder的方法进行生产当前型号的汽车;这样的话就不需要在客户端多次给汽车builder属性了,直接调用主管的对应型号的汽车生产方法即可。上面提供的代码样例是动态的,每个对象都是自定义的;类比汽车也可以选择一个维度让Person的创建交给主管执行,比如选择相貌维度(有帅哥、美女、丑八怪等),主管中生成帅哥的代码中,身高都是185,体重都是135等。具体使用自定义还是固化(主管)需要根据业务场景实际选择。