创建模式

建造者模式

定义

将一个复杂对象的构建与它的表示进行分离,使得同样的构建过程可以创建不同的表示

 

特征

用户只需指定需要建造的类型就可以得到他们,建造过程及细节不需要知道

类型

创建型

适用场景

如果一个对象有非常复杂的内部结构(很多属性)

想把复杂对象的创建和使用分离

优点

封装性好,创建和使用分离

扩展性好、建造类之间独立、一定程度上解耦

缺点

产生多余的builder对象

产品内部发生变化,建造者都要修改,成本较大

 

和工厂模式的区别

建造者模式更注重方法的调用顺序,而工厂模式注重于创建产品

创建对象的粒度不同:建造者模式可以创建一些复杂的产品,由各种复杂的部件组成,工厂模式创建出来的都是一个样子

关注点不同:工厂模式只要把产品创建出来就ok了,而建造者模式不仅要创建出这个产品,我还要知道这个产品都是由哪些部件组成的

建造者模式在某些业务场景,比如说一定的顺序决定了产出的产品不一样的话,那么这里也要把顺序进行调整,工厂则不关心顺序。

 

实例

假设我们要创建一个课程

 

   课程实体类

public class Course {
private String courseName;
private String coursePPT;
private String courseVideo;
private String courseArticle;
//question&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 setCourseArticle(String courseArticle) {
this.courseArticle = courseArticle;
}


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 {
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();
}
}

Test 测试类
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设计模式", "PPT"
, "视频", "手记", "问答");
System.out.println(course);
}
}

输出:
Course{courseName='java设计模式', coursePPT='PPT', courseVideo='视频', courseArticle='手记', courseQA='问答'}

uml

 

通过静态内部类链式调用来进行改进

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 setCourseName(String courseName) {
this.courseName = courseName;
return this;
}


public CourseBuilder setCoursePPT(String coursePPT) {
this.coursePPT = coursePPT;
return this;
}


public CourseBuilder setCourseVideo(String courseVideo) {
this.courseVideo = courseVideo;
return this;
}


public CourseBuilder setCourseArticle(String courseArticle) {
this.courseArticle = courseArticle;
return this;
}


public CourseBuilder setCourseQA(String courseQA) {
this.courseQA = courseQA;
return this;
}
public Course build(){
return new Course(this);
}
}
}

Test类
public class Test {
public static void main(String[] args) {
Course course = new Course.CourseBuilder().setCourseName("java设计模式").
setCoursePPT("PPT").setCourseArticle("手记").setCourseQA("问答").setCourseVideo("视频").build();
System.out.println(course);
}
}

输出:
Course{courseName='java设计模式', coursePPT='PPT', courseVideo='视频', courseArticle='手记', courseQA='问答'}

 

posted @ 2020-03-28 22:30  叫熊猫啊  阅读(239)  评论(0)    收藏  举报