设计模式:建造者模式
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
适用场景:如果一个对象有非常复杂的内部结构(属性多),或想把复杂对象的创建和使用分离
package com.edward.design.pattern.creational.builder; /** * Created by Edward on 2018/10/29. */ public class Course { private String courseName; private String coursePPT; private String courseVideo; private String courseArticle; private String courseQA; public Course(CourseBuilder courseBuilder){ this.courseName = courseBuilder.courseName; this.coursePPT = courseBuilder.coursePPT; this.courseVideo = courseBuilder.courseVideo; this.courseArticle = courseBuilder.courseArticle; 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 buildCorseVideo(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); } } @Override public String toString() { return "Course{" + "courseName='" + courseName + '\'' + ", coursePPT='" + coursePPT + '\'' + ", courseVideo='" + courseVideo + '\'' + ", courseArticle='" + courseArticle + '\'' + ", courseQA='" + courseQA + '\'' + '}'; } }
package com.edward.design.pattern.creational.builder; /** * Created by Edward on 2018/10/29. */ public class Test { public static void main(String[] args) { Course course = new Course.CourseBuilder().buildCourseName("JAVA").buildCoursePPT("JAVA-PPT").buildCorseVideo("JAVA-Video").buildCourseArticle("JAVA-Article").buildCourseQA("JAVA-QA").build(); System.out.println(course); } }
高亮加粗部分为链式调用,每一次调用的方法名都会提示参数内容,比较工厂方法(只是提供一个方法,需要传入创建对象的若干参数容易写错)更有条理和顺序
改课程类的创建顺序为:先得有课程名称(JAVA)、课程PPT(JAVA-PPT)、课程视频(JAVA-Video)、课程手记(JAVA-Article)、课程问答(JAVA-QA),最后才能创建对象