JAVA设计模式之【建造者模式】

1 定义

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

2 类图

产品类(Product):表示被创建的复杂对象。它通常包含多个部分或者组成,并由具体的建造者逐步构建而成。

抽象建造者类(Builder):定义了建造复杂对象所需要的各个部分的创建方法。它通常包括多个构建方法和一个返回产品的方法。

具体建造者类(ConcreteBuilder):实现Builder接口,并提供各个部分或者组成的构建方法。

调用者(Director):负责控制建造者的构建顺序,指挥建造者如何构建复杂对象。

3 应用场景

生活中场景

去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。

java应用场景

  • StringBuilder(append()开放构造步骤,最后toString()构造)
  • Lombok的@Builder注解

使用场景

当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。

4 代码案例

基本写法

首先创建一个产品类Course

java 复制代码
public class Course {
    private String name;
    private String ppt;
    private String video;
    private String note;
    private String homework;
    @Override
    public String toString() {
        return "CourseBuilder{" +
                "name='" + name + '\'' +
                ", ppt='" + ppt + '\'' +
                ", video='" + video + '\'' +
                ", note='" + note + '\'' +
                ", homework='" + homework + '\'' +
                '}';
    }
}

创建一个建造者类CourseBuilder

java 复制代码
public class CourseBuilder{
    private Course course = new Course();
    public void addName(String name) {
        course.setName(name);
    }
    
    public void addPPT(String ppt) {
        course.setPpt(ppt);
    }
    
    public void addVideo(String video) {
        course.setVideo(video);
    }
    
    public void addNote(String note) {
        course.setNote(note);
    }
    
    public void addHomework(String homework) {
        course.setHomework(homework);
    }
    
    public Course build() {
        return course;
    }
}

调用

java 复制代码
public class Test {
    public static void main(String[] args) {
        CourseBuilder builder = new CourseBuilder();
        builder.addName("设计模式");
        builder.addPPT("【PPT课件】");
        builder.addVideo("【回放视频】");
        builder.addNote("【课堂笔记】");
        builder.addHomework("【课后作业】");
        System.out.println(builder.build());
    }
}

责任链写法

修改 建造者类CourseBuilder:

  • 将产品类Course变为建造者类的内部类。
  • 将构造部分添加进去,都返回CourseBuilder(this)对象
    代码如下:
java 复制代码
public class CourseBuilder {
    private Course course = new Course();
    public CourseBuilder addName(String name) {
        course.setName(name);
        return this;
    }
    public CourseBuilder addPPT(String ppt) {
        course.setPpt(ppt);
        return this;
    }
    public CourseBuilder addVideo(String video) {
        course.setVideo(video);
        return this;
    }
    public CourseBuilder addNote(String note) {
        course.setNote(note);
        return this;
    }
    public CourseBuilder addHomework(String homework) {
        course.setHomework(homework);
        return this;
    }
    public Course build() {
        return this.course;
    }
    @Data
    public class Course {
        private String name;
        private String ppt;
        private String video;
        private String note;
        private String homework;
        @Override
        public String toString() {
            return "CourseBuilder{" +
                    "name='" + name + '\'' +
                    ", ppt='" + ppt + '\'' +
                    ", video='" + video + '\'' +
                    ", note='" + note + '\'' +
                    ", homework='" + homework + '\'' +
                    '}';
        }
    }
}

5 与工厂模式区别

  1. 建造者模式注重new的过程,工厂模式注重new的结果
  2. 创建对象力度不同,建造者模式创建复杂的对象,由各种复杂的部件组成,工厂模式创建出来的对象都一样

6 优缺点

优点

  1. 封装好,创建和使用隔离
  2. 扩展性好,建造类之间独立,一定程度上解耦

缺点

  1. 产生多余的Builder对象

如简单的可直接在Product构造,而建造者模式需要多创建一个Builder对象

  1. Product内部发生变化,建造者都要修改

比如原本年龄属性是整数类型,现在改为了字符串类型表示,那么在建造者类中的设置年龄的方法就需要相应修改

v 搜【谷丘Coder】发送【建造者模式】获取笔记资料与思维导图

相关推荐
哪 吒3 小时前
最简单的设计模式,抽象工厂模式,是否属于过度设计?
设计模式·抽象工厂模式
Theodore_10223 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸4 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象4 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了5 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·5 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic5 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王5 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康5 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神6 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式