一、建造者的定义与类型
》定义:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式就是一步步创建一个包含多个组件的对象,相同的构建过程可以创建不同的产品,比较适用于流程固定,建造过程不同的产品。
》用于只需要指定需要创建的类型就可以得到它们,建造过程及细节不需要
简单说,比如做菜,每个创建者创建的顺序可以不同,但各个组件一定是要加入的,最终创建一盘菜。 对应于后面代码中会有调用方法的顺序可以比较随意的点
》类型;创建型。
二、建造者的适用场景。
》如果一个对象有非常复杂的内部结构(类有很多属性)
》想把复杂对象的创建和使用分离
三、建造者优点
》封装性好,创建和使用分离
》扩展性好、建造者类之间独立、一定程度上解耦。
四、建造者缺点。
》产生多余的builder对象。
》产品内部发生变化,建造者都要修改,维护成本大。
五、建造者模式和工厂类相关的模式的差异:
》工厂者模式更注重于创造产品,建造者模式更关注于方法的调用顺序;
》创建对象的力度不同。建造者模式可以创建较为复杂的产品,由各种复杂的组件组成,而工厂模式创建出来的产品都是一个样子。
》工厂模式只是关注创建创造出来即可(只要有一个符合基本要求的产品即可,比如想要一个椅子,但不关心材质,目标只需要一个椅子),而建造者模式不仅关心创造出产品,还关注产品创建的细节,有哪些组件组成。可能因为细节的不同,创建出不一样的产品(比如会关注创造的是什么材质的椅子)。
》当创建一个对象需要复杂的过程时适合建造者模式,而创建一个对象只需要简单的方法时工厂类模式即可。
六、业务场景与代码实例:
》场景:假设慕课网上有专门的课程课程教练(coatch)负责和某个提供课程的公司的讲师进行对接。讲师负责提供课程相应的材料,而讲师的老总负责指挥。
》代码:
package com.zxl.design.pattern.creational.builder; /** * Created by Administrator on 2019/5/26. */ public class Course { private String courseName; private String coursePPT; private String courseArtical; private String courseVideo; private String courseQA; public String getCourseName() { return courseName; } public void setCourseName(String courseName) { this.courseName = courseName; } public String getCoursePPT() { return coursePPT; } public void setCoursePPT(String coursePPT) { this.coursePPT = coursePPT; } public String getCourseArtical() { return courseArtical; } public void setCourseArtical(String courseArtical) { this.courseArtical = courseArtical; } public String getCourseVideo() { return courseVideo; } public void setCourseVideo(String courseVideo) { this.courseVideo = courseVideo; } public String getCourseQA() { return courseQA; } public void setCourseQA(String courseQA) { this.courseQA = courseQA; } @Override public String toString() { return "Course{" + "courseName='" + courseName + '\'' + ", coursePPT='" + coursePPT + '\'' + ", courseArtical='" + courseArtical + '\'' + ", courseVideo='" + courseVideo + '\'' + ", courseQA='" + courseQA + '\'' + '}'; } } package com.zxl.design.pattern.creational.builder; /** * Created by Administrator on 2019/5/26. */ public abstract class CourseBuilder { private String courseName; private String coursePPT; private String courseArtical; private String courseVideo; private String courseQA; public abstract void buildCourseName(String courseName); public abstract void buildCoursePPT(String coursePPT); public abstract void buildCourseArtical(String courseArtical); public abstract void buildCourseVideo(String courseVideo); public abstract void buildCourseQA(String courseQA); public abstract Course makeCourse(); } package com.zxl.design.pattern.creational.builder; /** * Created by Administrator on 2019/5/26. */ public class CourseActualBuilder extends CourseBuilder { private Course course = new Course(); public void buildCourseName(String courseName) { course.setCourseName(courseName); } public void buildCoursePPT(String coursePPT) { course.setCoursePPT(coursePPT); } public void buildCourseArtical(String courseArtical) { course.setCourseArtical(courseArtical); } public void buildCourseVideo(String courseVideo) { course.setCourseVideo(courseVideo); } public void buildCourseQA(String courseQA) { course.setCourseQA(courseQA); } public Course makeCourse() { return course; } }package com.zxl.design.pattern.creational.builder; /** * Created by Administrator on 2019/5/26. */ public class Coatch { private CourseBuilder courseBuilder; public void setCourseBuilder(CourseBuilder courseBuilder) { this.courseBuilder = courseBuilder; } public Course makeCourse(String courseName, String coursePPT, String courseArtical, String courseVideo, String courseQA) { this.courseBuilder.buildCourseName(courseName); this.courseBuilder.buildCourseQA(courseQA); this.courseBuilder.buildCourseVideo(courseVideo); this.courseBuilder.buildCourseArtical(courseArtical); this.courseBuilder.buildCoursePPT(coursePPT); return this.courseBuilder.makeCourse(); } } package com.zxl.design.pattern.creational.builder; /** * Created by Administrator on 2019/5/26. */ public class Test { public static void main(String[] args) { CourseBuilder courseBuilder =new CourseActualBuilder(); Coatch coatch = new Coatch(); coatch.setCourseBuilder(courseBuilder); Course course =coatch.makeCourse("java 建造者模式","java 建造者模式PPT", "java 建造者模式手记","java 建造者模式视频", "java 建造者模式问答"); System.out.println(course); } }
初级版本:
建造者模式之升级版本:这也是比较常见的使用方式,可以进行链式调用,这也是建造者模式的一大特点。
该方式在进行设置属性时比较明确,尤其当属性多时,不容易产生参数因为顺序设置错误等原因造成错误。代码如下:
package com.zxl.design.pattern.creational.builder.buildv2; /** * Created by Administrator on 2019/5/26. */ public class Course { private String courseName; private String coursePPT; private String courseArtical; private String courseVideo; private String courseQA; public Course(CourseBuilder courseBuilder){ this.courseName = courseBuilder.courseName; this.coursePPT = courseBuilder.coursePPT; this.courseArtical = courseBuilder.courseArtical; this.courseVideo = courseBuilder.courseVideo; this.courseQA =courseBuilder.courseQA; } public String getCourseName() { return courseName; } public void setCourseName(String courseName) { this.courseName = courseName; } public String getCoursePPT() { return coursePPT; } public void setCoursePPT(String coursePPT) { this.coursePPT = coursePPT; } public String getCourseArtical() { return courseArtical; } public void setCourseArtical(String courseArtical) { this.courseArtical = courseArtical; } public String getCourseVideo() { return courseVideo; } public void setCourseVideo(String courseVideo) { this.courseVideo = courseVideo; } public String getCourseQA() { return courseQA; } public void setCourseQA(String courseQA) { this.courseQA = courseQA; } @Override public String toString() { return "Course{" + "courseName='" + courseName + '\'' + ", coursePPT='" + coursePPT + '\'' + ", courseArtical='" + courseArtical + '\'' + ", courseVideo='" + courseVideo + '\'' + ", courseQA='" + courseQA + '\'' + '}'; } public static class CourseBuilder{ private String courseName; private String coursePPT; private String courseArtical; private String courseVideo; private String courseQA; public CourseBuilder builderCourseName(String courseName){ this.courseName = courseName; return this; } public CourseBuilder builderCoursePPT(String coursePPT){ this.coursePPT = coursePPT; return this; } public CourseBuilder builderCourseArtical(String courseArtical){ this.courseArtical = courseArtical; return this; } public CourseBuilder builderCourseVideo(String courseVideo){ this.courseVideo = courseVideo; return this; } public CourseBuilder builderCourseQA(String courseQA){ this.courseQA = courseQA; return this; } public Course builde(){ return new Course(this); } } } package com.zxl.design.pattern.creational.builder.buildv2; import java.net.SocketPermission; /** * Created by Administrator on 2019/5/26. */ public class Test { public static void main(String[] args) { Course course = new Course.CourseBuilder().builderCourseName("java建造者模式v2") .builderCoursePPT("java建造者模式v2 PPT") .builderCourseArtical("java建造者模式v2手记") .builderCourseVideo("java建造者模式v2视频") .builderCourseQA("java建造者模式v2问答") .builde(); System.out.println(course); } }