当前位置: 首页 > article >正文

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

建造者模式.png

1 定义

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

2 类图

产品类(Product):表示被创建的复杂对象。它通常包含多个部分或者组成,并由具体的建造者逐步构建而成。
抽象建造者类(Builder):定义了建造复杂对象所需要的各个部分的创建方法。它通常包括多个构建方法和一个返回产品的方法。
具体建造者类(ConcreteBuilder):实现Builder接口,并提供各个部分或者组成的构建方法。
调用者(Director):负责控制建造者的构建顺序,指挥建造者如何构建复杂对象。

3 应用场景

生活中场景

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

java应用场景

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

使用场景

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

4 代码案例

基本写法

首先创建一个产品类Course

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

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;
    }
}

调用

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)对象
    代码如下:
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】发送【建造者模式】获取笔记资料与思维导图


http://www.kler.cn/a/386012.html

相关文章:

  • STM32单片机CAN总线汽车线路通断检测
  • 系统架构设计师第二版口诀
  • Qt文件目录操作
  • 博物馆实景复刻:开启沉浸式文化体验的新篇章
  • flink cdc 应用
  • MySQL查询某个数据库中特定表的空间占用大小
  • Java基于小程序公考学习平台的设计与实现(附源码,文档)
  • 大数据学习09之Hive基础
  • Beyond Compare 5 比较文本文件时,如何忽略字母的大小写差异?
  • docker入门(一)
  • unity显示获取 年月日周几【日期】
  • 关于Django 模型字段 `choices`自定义数据类型的枚举——补充
  • Java SPI——针对实习面试
  • 汽车和飞机研制过程中“骡车”和“铁鸟”
  • EL表达式和JSTL表达式(详解)
  • 【java】实战-力扣题库:移动零
  • Dubbo框架浅谈
  • 数字IC后端设计实现之Innovus自动修复Min Step DRC Violation方案
  • Agent指令编排
  • 双指针算法的妙用:提高代码效率的秘密(1)
  • ip地址跟路由器有关吗?更换路由器ip地址会变吗
  • iMeta | 复杂热图(ComplexHeatmap)可视化文章最新版,画热图就引它
  • 如何保证kafka生产者数据可靠性
  • Git别名设置
  • 【51单片机】LED点阵屏 原理 + 使用
  • 【数据分享】1901-2023年我国省市县镇四级的逐年降水数据(免费获取/Shp/Excel格式)