设计模式——建造者模式

    技术2022-07-21  92

    建造者模式

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

    适用场景

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

    优点于缺点

    优点:

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

    缺点:

    产生多余的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();

    关键点:

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

    UML

    开源项目中的构造者模式

    在JDK中,StringBuffer、StringBuilder就使用了构造者的思想。

    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

    Processed: 0.010, SQL: 10