定義
- 建造者模式是將一個複雜對象的構建與他的表示分離,使得同樣的構建過程可以創建不同的表示。
- 用戶只需要指定需要建造的類型就可以創建他們,創建過程及細節不需要知道。
- 類型: 創建型
適用場景
- 如果一個對象有非常複雜的內部結構(屬性多)
- 把複雜的對象的創建和使用分離
優點
- 封裝性好 創建和使用分離
- 拓展性好,建造類之間獨立,一定程度上解耦
缺點
- 產生多餘的builder對象
- 產品內部發生變化,建造者需要進行修改
建造者模式與工廠模式的區別
- 建造者模式更注重於方法的調用順序,工廠模式更注重於創建產品
- 創建對象的力度不同,工廠模式創建複雜產品可以由各種部件組成,工廠模式創建出來的產品相同。
- 工廠模式只需要創建出來,創建者模式需要知道該產品都有哪些部件。
- 創建一個對象需要很多步驟時適用於建造者模式,只需要簡單創建則工廠模式就可以。
Conding
Lombok插件中的@Builder註解提供的構建對象的方式就是典型的建造者模式。
package com.example.design.creational.course.v2;
import lombok.Data;
import lombok.ToString;
/**
* 建造者模式 靜態內部類
*
* @author wang
*/
@Data
@ToString
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.courseArticle = courseBuilder.courseArticle;
this.coursePpt = courseBuilder.coursePpt;
this.courseQa = courseBuilder.courseQa;
this.courseVideo = courseBuilder.courseVideo;
}
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 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);
}
}
}
使用時可以直接使用builder方式進行創建對象
package com.example.design.creational.course.v2;
/**
* @author wang
*/
public class Test {
public static void main(String[] args) {
Course course = new Course.CourseBuilder().
buildCourseArticle("article").
buildCourseName("name").
buildCoursePpt("ppt").
buildCourseQa("qa").
buildCourseVideo("video")
.build();
System.out.println(course);
}
}