建造者
将一个复杂对象的构建和他的表示分离,使得同样的构建过程可以创建不同的表示
用户只需要指定建造的类型就可以得到他们,不需要知道建造细节
适用场景
对象有很复杂的内部结构(such as : 很多属性)
把对象的创建和使用分离
优点
封装性好创建和使用分离
扩展性好,建造类之间独立,一定程度上解耦
缺点
产生多于的builder对象
产品内部发生变化,建造者都要修改,成本较大
建造者模式和工厂模式的区别
建造者注重方法的调用顺序,工厂注重产品
建造者可以创建由各种部件组成的复杂产品,工厂只要创建出来对象
建造者要知道产品的组成部件
有审查统一搭建和检查课程,
//课程建造者(可以声明为借口)
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 buildcoursenote(String coursenote);
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 buildcoursenote(String coursenote) {
course.setCoursenote(coursenote);
}
@Override
public void buildcourseQA(String courseQA) {
course.setCourseQA(courseQA);
}
//由于属性全在上面添加完成直接返回course就行
@Override
public Course makeCourse() {
return course;
}
}
//审查
package com.sun.com.sun.builder;
public class Coach {
private CourseBuilder courseBuilder;
public void setCourseBuilder(CourseBuilder courseBuilder){
this.courseBuilder=courseBuilder;
}
//制作课程
public Course makeCourse( String coursename, String courseppt, String coursevideo, String coursenote, String courseQA){
this.courseBuilder.buildcoursename(coursename);
this.courseBuilder.buildcourseppt(courseppt);
this.courseBuilder.buildcoursevideo(coursevideo);
this.courseBuilder.buildcoursenote(coursenote);
this.courseBuilder.buildcourseQA(courseQA);
return this.courseBuilder.makeCourse();
}
}
//测试
package com.sun.com.sun.builder;
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", "nn", "jjjj", "结果集", "yesorno");
System.out.println(course);
}
}
//实体类
package com.sun.com.sun.builder;
//课程
public class Course {
private String coursename;
private String courseppt;
private String coursevideo;
private String coursenote;
//question and answer
private String courseQA;
public void setCoursename(String coursename) {
this.coursename = coursename;
}
public void setCourseppt(String courseppt) {
this.courseppt = courseppt;
}
public void setCoursevideo(String coursevideo) {
this.coursevideo = coursevideo;
}
public void setCoursenote(String coursenote) {
this.coursenote = coursenote;
}
public void setCourseQA(String courseQA) {
this.courseQA = courseQA;
}
public String getCoursename() {
return coursename;
}
public String getCourseppt() {
return courseppt;
}
public String getCoursevideo() {
return coursevideo;
}
public String getCoursenote() {
return coursenote;
}
public String getCourseQA() {
return courseQA;
}
@Override
public String toString() {
return "Course{" +
"coursename='" + coursename + '\'' +
", courseppt='" + courseppt + '\'' +
", coursevideo='" + coursevideo + '\'' +
", coursenote='" + coursenote + '\'' +
", courseQA='" + courseQA + '\'' +
'}';
}
}
链式调用优化
package com.sun.com.sun.builder;
import java.security.PublicKey;
//课程
public class Course {
private String coursename;
private String courseppt;
private String coursevideo;
private String coursenote;
//question and answer
private String courseQA;
public Course(CourseBuilder courseBuilder) {
this.coursename = courseBuilder.coursename;
this.courseppt=courseBuilder.courseppt;
this.coursevideo=courseBuilder.coursevideo;
this.coursenote=courseBuilder.coursenote;
this.courseQA=courseBuilder.courseQA;
}
public void setCoursename(String coursename) {
this.coursename = coursename;
}
public void setCourseppt(String courseppt) {
this.courseppt = courseppt;
}
public void setCoursevideo(String coursevideo) {
this.coursevideo = coursevideo;
}
public void setCoursenote(String coursenote) {
this.coursenote = coursenote;
}
public void setCourseQA(String courseQA) {
this.courseQA = courseQA;
}
public String getCoursename() {
return coursename;
}
public String getCourseppt() {
return courseppt;
}
public String getCoursevideo() {
return coursevideo;
}
public String getCoursenote() {
return coursenote;
}
public String getCourseQA() {
return courseQA;
}
@Override
public String toString() {
return "Course{" +
"coursename='" + coursename + '\'' +
", courseppt='" + courseppt + '\'' +
", coursevideo='" + coursevideo + '\'' +
", coursenote='" + coursenote + '\'' +
", courseQA='" + courseQA + '\'' +
'}';
}
public static class CourseBuilder{
private String coursename;
private String courseppt;
private String coursevideo;
private String coursenote;
//question and 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 buildcoursenote(String coursenote){
this.coursenote=coursenote;
return this;
}
public CourseBuilder buildcourseQA(String courseQA){
this.courseQA=courseQA;
return this;
}
public Course build(){
return new Course(this);
}
}
}
//测试
package com.sun.com.sun.builder;
public class Test {
public static void main(String[] args) {
Course course=new Course.CourseBuilder().buildcoursename("java").buildcoursenote("note").buildcourseppt("ppt").buildcoursevideo("video").buildcourseQA("QA").build();
System.out.println(course);
}
}