JAVA设计模式之构建器模式(builder)

构建器模式:

  • 分离复杂对象的构建和表示
  • 同样的构建过程可以创建不同的表示
  • 无需记忆,自然使用
  • 同模板方法模式非常相似,只是模板方法是强调方法执

场景:假如有一个类非常复杂,它有100个属性,如果使用java提供的构造方法构建它需要给它传递100个参数,这么构建岂不是很费劲,而且在实际的业务场景中并不需要对该

对象的所有属性都赋值,那么使用构建器模式我们可以先构建一部分,再构建一部分,最后构建其他的,这样的化就可以根据实际业务场景灵活的控制对象的构建过程。

代码实现:

package com.srr.dp.builder;

/**
 * 构建器接口
 */
public interface Builder {
    Builder build0();
    Builder build1();
    Builder build2();
    ComplexClass build();
}

package com.srr.dp.builder;

/**
 * 复杂对象
 */
public class ComplexClass {
    protected class1 c1;
    protected class2 c2;
    protected class3 c3;
}

class class1 {
    private int a;
    class1(int a){
        this.a = a;
    }
}

class class2 {
    private String name;
    class2(String name){
        this.name = name;
    }
}

class class3 {
    private long b;
    class3(long b){
        this.b = b;
    }
}

package com.srr.dp.builder;

/**
 * 简单构建器
 */
public class SimpleBuilder implements Builder {
    ComplexClass cc = new ComplexClass();
    @Override
    public Builder build0() {
        class1 c1 = new class1(1);
        cc.c1 = c1;
        return this;
    }

    @Override
    public Builder build1() {
        class2 c2 = new class2("");
        cc.c2 = c2;
        return this;
    }

    @Override
    public Builder build2() {
        class3 c3 = new class3(2L);
        cc.c3 = c3;
        return this;
    }

    @Override
    public ComplexClass build() {
        return cc;
    }
}

package com.srr.dp.builder;

/**
 * 测试类
 */
public class T2 {
    Builder builder = new SimpleBuilder();
    ComplexClass cc = builder.build0().build1().build2()
            .build();
}

在我们实际的业务场景中如何使用的呢,请看代码:

package com.srr.dp.builder;

import java.sql.Date;

/**
 * 实际应用场景使用构建器模式
 */
public class Person {
    private int age;
    private String  name;
    private int sex;
    private Date birthday;
    private int weight;

    public static class PersonBuilder{
        Person person = new Person();
        public PersonBuilder buildinfo(int age,String name,int sex) {
            person.age = age;
            person.name = name;
            person.sex = sex;
            return this;
        }

        public PersonBuilder buildWeight(int weight) {
            person.weight = weight;
            return this;
        }

        public PersonBuilder buildBirthday(Date birthday) {
            person.birthday = birthday;
            return this;
        }

        public Person build() {
            return person;
        }
    }

}

package com.srr.dp.builder;

import java.sql.Date;

/**
 * 测试类
 * 如果Person类有100个属性,而且并不是所有的属性都需要赋值,用的时候赋值,不用的时候不传值
 * 如果使用java普通的构建方式,100个参数都赋值,读起来费劲,写起来累死
 * 鉴于只是说明原理,并没有实际构建100个属性
 */
public class T {
    public static void main(String[] args) {
        Person person = new Person.PersonBuilder().buildinfo(32,"srr",0)
                .buildWeight(120) //如果不想构建weight那么不调用buildWeight即可
                .buildBirthday(new Date(1L)).build();
    }
}

 

posted @ 2020-05-19 23:14  引路的风  阅读(792)  评论(0编辑  收藏  举报