设计模式建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )相关的知识,希望对你有一定的参考价值。





一、建造者模式简介



建造者模式 :一个复杂对象构建过程 与其 表示 分离 , 使得 同样的构建过程 , 可以 创建不同的表示 ;

用户只需要 指定 需要建造的类型 就可以 得到该类型对应的产品实例 , 不关心建造过程细节 ;

建造者模式就是 如何逐步构建包含多个组件的对象 , 相同的构建过程 , 可以创建不同的产品 ,


建造者模式类型 : 创建型 ;





二、建造者模式适用场景



建造者模式适用场景 :

  • 结构复杂 : 对象 有 非常复杂的内部结构 , 有很多属性 ;
  • 分离创建和使用 : 想把 复杂对象 的 创建使用 分离 ;

当创造一个对象 需要很多步骤时 , 适合使用建造者模式 ;
当创造一个对象 只需要一个简单的方法就可以完成 , 适合使用工厂模式 ;





三、建造者模式优缺点



建造者模式优点 :

  • 封装性好 : 创建使用 分离 ;
  • 扩展性好 : 建造类之间 相互独立 , 在 一定程度上解耦 ;

建造者模式缺点 :

  • 增加类数量 : 产生多余的 Builder 对象 ;
  • 内部修改困难 : 如果 产品内部发生变化 , 建造者也要相应修改 ;




四、建造者模式与工厂模式



建造者模式 与 工厂模式 :

  • 注重点不同 : 建造者模式 更注重于 方法的调用顺序 ; 工厂模式 注重于 创建产品 , 不关心方法调用的顺序 ;
  • 创建对象力度不同 : 创建对象的力度不同 , 建造者模式可以创建复杂的产品 , 由各种复杂的部件组成 , 工厂模式创建出来的都是相同的实例对象 ,




五、建造者模式代码示例




1、学生类


package builder;

/**
 * 学生类
 */
public class Student {
    private String name;
    private String age;
    private String number;
    private String address;
    private String school;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getSchool() {
        return school;
    }

    public void setSchool(String school) {
        this.school = school;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\\'' +
                ", age='" + age + '\\'' +
                ", number='" + number + '\\'' +
                ", address='" + address + '\\'' +
                ", school='" + school + '\\'' +
                '}';
    }
}

2、建造者抽象类


package builder;

/**
 * 抽象建造者
 */
public abstract class StudentBuilder {
    public abstract void buildName(String name);
    public abstract void buildAge(String age);
    public abstract void buildNumber(String number);
    public abstract void buildAddress(String address);
    public abstract void buildSchool(String school);

    public abstract Student makeCourse();
}

3、建造者实现类


package builder;

/**
 * 建造者实现类
 */
public class StudentBuilderImpl extends StudentBuilder {

    private Student student = new Student();

    @Override
    public void buildName(String name) {
        this.student.setName(name);
    }

    @Override
    public void buildAge(String age) {
        this.student.setAge(age);
    }

    @Override
    public void buildNumber(String number) {
        this.student.setNumber(number);
    }

    @Override
    public void buildAddress(String address) {
        this.student.setAddress(address);
    }

    @Override
    public void buildSchool(String school) {
        this.student.setSchool(school);
    }

    @Override
    public Student makeCourse() {
        return this.student;
    }
}

4、教师类 ( 非必须 )


package builder;

/**
 * 教师类 , 负责使用建造者创建学生信息
 */
public class Teacher {
    /**
     * 持有学生建造者
     */
    private StudentBuilder studentBuilder;

    /**
     * 构造函数注入建造者
     * @param studentBuilder
     */
    public Teacher(StudentBuilder studentBuilder) {
        this.studentBuilder = studentBuilder;
    }

    /**
     * 调用建造者对象创建 学生 实例对象
     * @param name
     * @param age
     * @param number
     * @param address
     * @param school
     * @return
     */
    public Student makeStudent(String name, String age,
                               String number, String address,
                               String school) {
        this.studentBuilder.buildName(name);
        this.studentBuilder.buildAge(age);
        this.studentBuilder.buildNumber(number);
        this.studentBuilder.buildAddress(address);
        this.studentBuilder.buildSchool(school);

        return this.studentBuilder.makeCourse();
    }
}

5、测试类


package builder;

public class Main {
    public static void main(String[] args) {
        // 创建学生对象建造者
        StudentBuilder studentBuilder = new StudentBuilderImpl();
        // 创建教师对象
        Teacher teacher = new Teacher(studentBuilder);

        // 教师对象使用学生建造者创建学生 实例对象
        Student student = teacher.makeStudent(
                "小明",
                "12" ,
                "1",
                "学院路",
                "第一小学");

        System.out.println(student);
    }
}

执行结果 :

Student{name='小明', age='12', number='1', address='学院路', school='第一小学'}





六、实例类和建造者类定义在同一个类中 ( 建造者模式常用用法 )




1、实例类 + 建造者类


package builder2;

/**
 * 学生类
 */
public class Student {
    private String name;
    private String age;
    private String number;
    private String address;
    private String school;

    public Student(StudentBuilder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.number = builder.number;
        this.address = builder.address;
        this.school = builder.school;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getSchool() {
        return school;
    }

    public void setSchool(String school) {
        this.school = school;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\\'' +
                ", age='" + age + '\\'' +
                ", number='" + number + '\\'' +
                ", address='" + address + '\\'' +
                ", school='" + school + '\\'' +
                '}';
    }

    /**
     * 使用静态内部类作为创建者
     *      将具体的业务类 及其 创建者 定义在一个类中
     * 使用链式调用 , 每个 build 步骤都返回创建者本身
     */
    public static class StudentBuilder {
        private String name;
        private String age;
        private String number;
        private String address;
        private String school;

        public StudentBuilder buildName(String name) {
            this.name = name;
            return this;
        }

        public StudentBuilder buildAge(String age) {
            this.age = age;
            return this;
        }

        public StudentBuilder buildNumber(String number) {
            this.number = number;
            return this;
        }

        public StudentBuilder buildAddress(String address) {
            this.address = address;
            return this;
        }

        public StudentBuilder buildSchool(String school) {
            this.school = school;
            return this;
        }

        public Student build() {
            return new Student(this);
        }
    }
}

2、测试类


package builder2;

public class Main {
    public static void main(String[] args) {
        // 使用链式调用 , 一行代码创建实例对象
        Student student = new Student.StudentBuilder()
                .buildName("小明")
                .buildAge("12")
                .buildNumber("1")
                .buildAddress("学院路")
                .buildSchool("第一小学")
                .build();

        System.out.println(student);
    }
}

执行结果 :

Student{name='小明', age='12', number='1', address='学院路', school='第一小学'}

以上是关于设计模式建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )的主要内容,如果未能解决你的问题,请参考以下文章

建造者模式

设计模式----建造者模式

设计模式·建造者模式

④创建型设计模式建造者模式

④创建型设计模式建造者模式

建造者模式