建造者模式
- 定义:将一个简单对象的构建与它的示意拆散,使得同样的构建过程能够创立不同的示意
- 用户只需指定须要建造的类型就能够失去它们,建造过程及细节不须要晓得
- 类型:创立型
实用场景:
- 如果一个对象有非常复杂的内部结构(很多属性)
- 想把简单对象的创立和应用拆散
长处:
- 封装性好,创立和应用拆散
- 扩展性好、建造类之间独立、肯定水平上解耦
毛病:
- 产生多余的Builder对象
- 产品外部发生变化,建造者都要批改,老本较大
代码示例
版本一:
public class Course { private String courseName; private String coursePPT; private String courseVideo; private String courseArticle;// question&Answer 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 getCourseVideo() { return courseVideo; } public void setCourseVideo(String courseVideo) { this.courseVideo = courseVideo; } public String getCourseArticle() { return courseArticle; } public void setCourseArticle(String courseArticle) { this.courseArticle = courseArticle; } public String getCourseQA() { return courseQA; } public void setCourseQA(String courseQA) { this.courseQA = courseQA; } @Override public String toString() { return "Course{" + "courseName='" + courseName + '\'' + ", coursePPT='" + coursePPT + '\'' + ", courseVideo='" + courseVideo + '\'' + ", courseArticle='" + courseArticle + '\'' + ", courseQA='" + courseQA + '\'' + '}'; }}
public abstract class CourseBuilder { public abstract void buildCourseName(String courseName); public abstract void buildCoursePPT(String coursePPT); public abstract void buildCourseVideo(String courseVideo); public abstract void buildCourseArticle(String courseArticle); public abstract void buildCourseQA(String courseQA); public abstract Course makeCourse();}
public class CourseActualBuilder extends CourseBuilder{ private Course course = new Course(); @Override public void buildCourseName(String courseName) { course.setCourseName(courseName); } @Override public void buildCoursePPT(String coursePPT) { course.setCoursePPT(coursePPT); } @Override public void buildCourseVideo(String courseVideo) { course.setCourseVideo(courseVideo); } @Override public void buildCourseArticle(String courseArticle) { course.setCourseArticle(courseArticle); } @Override public void buildCourseQA(String courseQA) { course.setCourseQA(courseQA); } @Override public Course makeCourse() { return course; }}
public class Coach { private CourseBuilder courseBuilder; public void setCourseBuilder(CourseBuilder courseBuilder) { this.courseBuilder = courseBuilder; } public Course makeCourse(String courseName,String coursePPT, String courseVideo,String courseArticle, String courseQA){ courseBuilder.buildCourseName(courseName); courseBuilder.buildCoursePPT(coursePPT); courseBuilder.buildCourseVideo(courseVideo); courseBuilder.buildCourseArticle(courseArticle); courseBuilder.buildCourseQA(courseQA); return courseBuilder.makeCourse(); }}
测试类:
public class Test { public static void main(String[] args) { CourseBuilder courseBuilder = new CourseActualBuilder(); Coach coach = new Coach(); coach.setCourseBuilder(courseBuilder); Course course = coach.makeCourse("Java设计模式","Java设计模式PPT","Java设计模式视频", "Java设计模式手记","Java设计模式问答"); System.out.println(course); }}
版本二:
public class Course { private String courseName; private String coursePPT; private String courseVideo; private String courseArticle;// question&Answer 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; } @Override public String toString() { return "Course{" + "courseName='" + courseName + '\'' + ", coursePPT='" + coursePPT + '\'' + ", courseVideo='" + courseVideo + '\'' + ", courseArticle='" + courseArticle + '\'' + ", courseQA='" + courseQA + '\'' + '}'; } public static class CourseBuilder { private String courseName; private String coursePPT; private String courseVideo; private String courseArticle; // question&Answer 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); } }}
测试类:
public class Test { public static void main(String[] args) { CourseBuilder courseBuilder = new CourseActualBuilder(); Coach coach = new Coach(); coach.setCourseBuilder(courseBuilder); Course course = coach.makeCourse("Java设计模式","Java设计模式PPT","Java设计模式视频", "Java设计模式手记","Java设计模式问答"); System.out.println(course); }}
利用场景
JDK:
- StringBuilder(线程不平安)
- StringBuffer(线程平安)
- guava(CacheBuilder)
- Spring(BeanDefinitionBuilder)
- Mybatis(SqlSessionFactoryBuilder(XMLConfigBuilder))