建造者模式

1.定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;
    用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道。

2.类型:创建型

3.适用场景:如果一个对象有非常复杂的内部结构(很多属性);想把复杂对象的创建和使用分离。

4.优点:封装性好,创建和使用分离;扩展性好、建造类之间独立、一定程度上解耦。

5.缺点:产生多余的Builder对象;产品内部发生变化,建造者都要修改,成本较大

6.实例目录package

7.实例UML类图

内部类

8.代码

 1 package com.geely.design.pattern.creational.builder;
 2 
 3 public class Course {
 4     private String courseName;
 5     private String coursePPT;
 6     private String courseVideo;
 7     private String courseArticle;
 8     private String courseQA;
 9 
10     public String getCourseName() {
11         return courseName;
12     }
13 
14     public void setCourseName(String courseName) {
15         this.courseName = courseName;
16     }
17 
18     public String getCoursePPT() {
19         return coursePPT;
20     }
21 
22     public void setCoursePPT(String coursePPT) {
23         this.coursePPT = coursePPT;
24     }
25 
26     public String getCourseVideo() {
27         return courseVideo;
28     }
29 
30     public void setCourseVideo(String courseVideo) {
31         this.courseVideo = courseVideo;
32     }
33 
34     public String getCourseArticle() {
35         return courseArticle;
36     }
37 
38     public void setCourseArticle(String courseArticle) {
39         this.courseArticle = courseArticle;
40     }
41 
42     public String getCourseQA() {
43         return courseQA;
44     }
45 
46     public void setCourseQA(String courseQA) {
47         this.courseQA = courseQA;
48     }
49 
50     @Override
51     public String toString() {
52         return "Course{" +
53                 "courseName='" + courseName + '\'' +
54                 ", coursePPT='" + coursePPT + '\'' +
55                 ", courseVideo='" + courseVideo + '\'' +
56                 ", courseArticle='" + courseArticle + '\'' +
57                 ", courseQA='" + courseQA + '\'' +
58                 '}';
59     }
60 }
 1 package com.geely.design.pattern.creational.builder;
 2 
 3 public abstract class CourseBuilder {
 4 
 5     public abstract void builderCourseName(String courseName);
 6     public abstract void builderCoursePPT(String coursePPT);
 7     public abstract void builderCourseVideo(String courseVideo);
 8     public abstract void builderCourseArticle(String courseArticle);
 9     public abstract void builderCourseQA(String courseQA);
10 
11     public abstract Course makeCourse();
12 }
 1 package com.geely.design.pattern.creational.builder;
 2 
 3 public class CourseActualBuilder extends CourseBuilder{
 4     private Course course = new Course();
 5     @Override
 6     public void builderCourseName(String courseName) {
 7         course.setCourseName(courseName);
 8     }
 9 
10     @Override
11     public void builderCoursePPT(String coursePPT) {
12         course.setCoursePPT(coursePPT);
13     }
14 
15     @Override
16     public void builderCourseVideo(String courseVideo) {
17         course.setCourseVideo(courseVideo);
18     }
19 
20     @Override
21     public void builderCourseArticle(String courseArticle) {
22         course.setCourseArticle(courseArticle);
23     }
24 
25     @Override
26     public void builderCourseQA(String courseQA) {
27         course.setCourseQA(courseQA);
28     }
29 
30     @Override
31     public Course makeCourse() {
32         return course;
33     }
34 }
 1 package com.geely.design.pattern.creational.builder;
 2 
 3 public class Coach {
 4     private CourseBuilder courseBuilder;
 5     public void setCourseBuilder(CourseBuilder courseBuilder){
 6         this.courseBuilder = courseBuilder;
 7     }
 8 
 9     public Course makeCourse(String courseName,String coursePPT,
10                              String courseVideo,String courseArticle,
11                              String courseQA){
12         this.courseBuilder.builderCourseArticle(courseArticle);
13         this.courseBuilder.builderCourseName(courseName);
14         this.courseBuilder.builderCoursePPT(coursePPT);
15         this.courseBuilder.builderCourseVideo(courseVideo);
16         this.courseBuilder.builderCourseQA(courseQA);
17         return this.courseBuilder.makeCourse();
18     }
19 }
 1 package com.geely.design.pattern.creational.builder;
 2 
 3 public class Test {
 4     public static void main(String[] args) {
 5         CourseBuilder courseBuilder = new CourseActualBuilder();
 6         Coach coach = new Coach();
 7         coach.setCourseBuilder(courseBuilder);
 8         Course course = coach.makeCourse(
 9                 "JAVA设计模式精讲",
10                 "JAVA设计模式精讲PPT",
11                 "JAVA设计模式精讲视频",
12                 "JAVA设计模式精讲手记",
13                 "JAVA设计模式精讲问答");
14         System.out.println(course);
15     }
16 }

 内部类

 1 package com.geely.design.pattern.creational.builder.v2;
 2 
 3 public class Course {
 4     private String courseName;
 5     private String coursePPT;
 6     private String courseVideo;
 7     private String courseArticle;
 8     private String courseQA;
 9 
10     public Course(CourseBuilder courseBuilder){
11         this.courseName = courseBuilder.courseName;
12         this.coursePPT = courseBuilder.coursePPT;
13         this.courseVideo = courseBuilder.courseVideo;
14         this.courseArticle = courseBuilder.courseArticle;
15         this.courseQA = courseBuilder.courseQA;
16     }
17     
18     @Override
19     public String toString() {
20         return "Course{" +
21                 "courseName='" + courseName + '\'' +
22                 ", coursePPT='" + coursePPT + '\'' +
23                 ", courseVideo='" + courseVideo + '\'' +
24                 ", courseArticle='" + courseArticle + '\'' +
25                 ", courseQA='" + courseQA + '\'' +
26                 '}';
27     }
28 
29     public static class CourseBuilder {
30         private String courseName;
31         private String coursePPT;
32         private String courseVideo;
33         private String courseArticle;
34         private String courseQA;
35 
36         public CourseBuilder builderCourseName(String courseName){
37             this.courseName = courseName;
38             return this;
39         }
40         public CourseBuilder builderCoursePPT(String coursePPT){
41             this.coursePPT = coursePPT;
42             return this;
43         }
44         public CourseBuilder builderCourseVideo(String courseVideo){
45             this.courseVideo = courseVideo;
46             return this;
47         }
48 
49         public CourseBuilder builderCourseArticle(String courseArticle){
50             this.courseArticle = courseArticle;
51             return this;
52         }
53         public CourseBuilder builderCourseQA(String courseQA){
54             this.courseQA = courseQA;
55             return this;
56         }
57 
58         public Course builder(){
59             return new Course(this);
60         }
61     }
62 }
 1 package com.geely.design.pattern.creational.builder.v2;
 2 
 3 import avro.shaded.com.google.common.collect.ImmutableSet;
 4 
 5 import java.util.Set;
 6 
 7 public class Test {
 8     public static void main(String[] args) {
 9         Course course = new Course.CourseBuilder()
10                 .builderCourseArticle("JAVA设计模式精讲手记")
11                 .builderCourseName("JAVA设计模式精讲")
12                 .builderCoursePPT("JAVA设计模式精讲PPT")
13                 .builderCourseQA("JAVA设计模式精讲问答")
14                 .builderCourseVideo("JAVA设计模式精讲视频").builder();
15         System.out.println(course);
16         Set<String> set = ImmutableSet.<String>builder().add("a").add("b").build();
17         System.out.println(set);
18     }
19 }

 

posted @ 2019-01-06 14:15  逢春  阅读(139)  评论(0编辑  收藏  举报