GOF23设计模式之建造者模式-Builder

本文简单介绍建造者模式,以及介绍lombok@Builder实现原理。
建造者模式(Builder)及其应用

建造者模式

概述

  • 将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
  • 用户只需指定需要建造的类型就可以得到他们,建造过程及细节不需要知道

类型:创建型设计模式

适用场景:

  1. 如果一个对象有非常复杂的内部结构(很多属性)
  2. 想把复杂对象的创建和使用分离

四种角色

  • Product (产品角色):一个具体的产品对象。
  • Builder (抽象建造者):创建一个Product对象的各个部件指定的接口/抽象类。
  • ConcreteBuilder (具体建造者):实现接口,构建和装配各个部件。
  • Director (指挥者):构建一一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是隔离了客户与对象的生产过程,二是负责控制产品对象的生产过程。

UML类图

在这里插入图片描述

Coding

学生类

public class Student {
    private String name;
    private char sex;
    private Integer age;

    public String getName() {
        return name;
    }

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

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

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

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

建造者接口(抽象建造者)

public interface IStudentBuilder {

    IStudentBuilder builderName(String name);

    IStudentBuilder builderAge(Integer age);

    IStudentBuilder builderSex(char sex);

    Student bulid();
}

建造者

public class StudentBuilder implements IStudentBuilder {
    private Student student = new Student();
    @Override
    public IStudentBuilder builderName(String name) {
        student.setName(name);
        return this;
    }

    @Override
    public IStudentBuilder builderAge(Integer age) {
        student.setAge(age);
        return this;
    }

    @Override
    public IStudentBuilder builderSex(char sex) {
        student.setSex(sex);
        return this;
    }

    @Override
    public Student bulid() {
        return student;
    }
}

指挥者

public class Director {
    private IStudentBuilder iStudentBuilder;

    public void setCourseBuilder(IStudentBuilder iStudentBuilder) {
        this.iStudentBuilder = iStudentBuilder;
    }

    public Student makeStudent(String name,Integer age,
                             char sex ){
        this.iStudentBuilder.builderAge(age);
        this.iStudentBuilder.builderSex(sex);
        this.iStudentBuilder.builderName(name);
        return this.iStudentBuilder.bulid();
    }
}

客户端(应用层)

    public static void main(String[] args) {
        Director director = new Director();
        director.setCourseBuilder(new StudentBuilder());
        Student student = director.makeStudent("张三", 18, '女');
        System.out.println(student);
    }
  • uml
    在这里插入图片描述

优点:

  • 封装性好,创建和使用分离
  • 扩展性好、建造者之间独立、一定程度上解耦

缺点:

  • 产生多余的Builder对象
  • 产品内部发生变化,建造者都要修改,成本较大

升级:链式处理

  • coding
public class Student {
    private String name;
    private char sex;
    private Integer age;

    public String getName() {
        return name;
    }

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

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

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

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


    public static class Builder {
        private Student student = new Student();

        public Builder builderName(String name) {
            student.setName(name);
            return this;
        }

        public Builder builderAge(Integer age) {
            student.setAge(age);
            return this;
        }

        public Builder builderSex(char sex) {
            student.setSex(sex);
            return this;
        }

        public Student bulid() {
            return student;
        }

    }
}

测试类

    public static void main(String[] args) {
        Student bulid = new Student.Builder().builderAge(10).builderName("李四").builderSex('男').bulid();
        System.out.println(bulid);
    }

框架中的建造者模式

后续补

拓展知识:Lombok

@Builder就可以实现建造者链式处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值