设计模式——建造者模式

建造者模式

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

适用场景

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

优点于缺点

优点:

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

缺点:

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

有人就会有疑问,同样是创建型,构造者模式与工厂模式有什么区别?
首先两者创建对象的粒度不一样,建造者模式适合创建一些复杂的对象(具有很多属性),建造者模式关注产品的内容、属性,而工厂模式关注产品的产品等级或者产品族。再者,建造者模式可以通过方法的顺序来控制产出产品的内容的不同,而工厂模式不关心这些,因此在使用这两种设计模式的初衷是完全不一样的。

实现建造者模式(java)

学习java后端编程的伙伴,应该很熟悉lombok这个插件。通过@Builder注解来生成一个建造者模式,不过这是插件自动帮我们生成,手动编写又是什么样的呢?

public class Course {
    private String courseName;
    private String coursePPT;
    private String courseVideo;
    private String courseArticle;
    private String courseQA;

   //此处省略一般bean的get/set方法等...

    public Course(CourseBuilder courseBuilder) {
        this.courseName = courseBuilder.courseName;
        this.courseArticle = courseBuilder.courseArticle;
        this.courseVideo = courseBuilder.courseVideo;
        this.coursePPT = courseBuilder.coursePPT;
        this.courseQA = courseBuilder.courseQA;
    }

    //静态内部类
    public static class CourseBuilder{
        //与外部类的属性相对应,可以做一些赋初值的操作等
        private String courseName;
        private String coursePPT;
        private String courseVideo;
        private String courseArticle;
        private String courseQA;

        public CourseBuilder buildCourseName(String courseName) {
            this.courseName = courseName;
            return this;
        }

        public CourseBuilder buildCoursePPt(String coursePPT) {
            this.coursePPT = coursePPT;
            return this;
        }

        public CourseBuilder buildCourseVideo(String courseVideo) {
            this.courseVideo = courseVideo;
            return this;
        }

        public CourseBuilder buildCourseArticle(String courseArticle) {
            this.courseArticle = courseArticle;
            return this;
        }

        public CourseBuilder buildCourseQA(String courseQA) {
            this.courseQA = courseQA;
            return this;
        }

        public Course build() {
            //调用外部类的构造方法
            return new Course(this);
        }
    }
}

通过控制方法的调用(链式调用)来控制产品的属性:

Course course = new Course.CourseBuilder()
                .buildCourseArticle("javaArticle")
                .buildCourseName("javaCourse")
                .build();

关键点:

  1. 内部类与外部类的属性对应,因此可以通过构造函数使用内部类的属性对外部类属性赋值。
  2. 内部类构建属性的函数返回当前builder对象,因此可以链式调用。
  3. bulid()通过外部类的构造函数返回外部类对象。

UML

在这里插入图片描述

开源项目中的构造者模式

在JDK中,StringBufferStringBuilder就使用了构造者的思想。

  public StringBuilder append(double var1) {
        super.append(var1);
        return this;
    }

    public StringBuilder appendCodePoint(int var1) {
        super.appendCodePoint(var1);
        return this;
    }

    public StringBuilder delete(int var1, int var2) {
        super.delete(var1, var2);
        return this;
    }

    public StringBuilder deleteCharAt(int var1) {
        super.deleteCharAt(var1);
        return this;
    }

还有很多开源框架使用了Builer模式,比如:MyBatis的配置文件加载的过程SqlSessionFactoryBuilder,XMLConfigBuilder大家可以去了解下。通过学习开源框架来学习设计模式,并运用到自己的项目中去吧~

项目源码地址
https://github.com/DiangD/design_pattern_practice

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值