設計模式4-建造者模式

定義

  1. 建造者模式是將一個複雜對象的構建與他的表示分離,使得同樣的構建過程可以創建不同的表示。
  2. 用戶只需要指定需要建造的類型就可以創建他們,創建過程及細節不需要知道。
  3. 類型: 創建型

適用場景

  1. 如果一個對象有非常複雜的內部結構(屬性多)
  2. 把複雜的對象的創建和使用分離

優點

  1. 封裝性好 創建和使用分離
  2. 拓展性好,建造類之間獨立,一定程度上解耦

缺點

  1. 產生多餘的builder對象
  2. 產品內部發生變化,建造者需要進行修改

建造者模式與工廠模式的區別

  1. 建造者模式更注重於方法的調用順序,工廠模式更注重於創建產品
  2. 創建對象的力度不同,工廠模式創建複雜產品可以由各種部件組成,工廠模式創建出來的產品相同。
  3. 工廠模式只需要創建出來,創建者模式需要知道該產品都有哪些部件。
  4. 創建一個對象需要很多步驟時適用於建造者模式,只需要簡單創建則工廠模式就可以。

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);


    }
}

發佈了30 篇原創文章 · 獲贊 13 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章