Java描述設計模式(06):建造者模式

来源:https://www.cnblogs.com/cicada-smile/archive/2019/08/06/11312555.html
-Advertisement-
Play Games

一、生活場景 基於建造者模式,描述軟體開發的流程。 1、代碼實現 2、代碼結構圖 二、建造者模式 1、基礎概念 建造模式是對象的創建模式。建造模式可以將一個產品的內部屬性描述與產品的生產過程分割,從而可以使一個建造過程生成具有不同的內部表象的產品對象。也就是使用一個中介對象封裝一系列的對象交互,使其 ...


一、生活場景

基於建造者模式,描述軟體開發的流程。

1、代碼實現

/**
 * 基於建造者模式描述軟體開發
 */
public class C01_InScene {
    public static void main(String[] args) {
        BuilderSoft builderSoft = new SoftImpl () ;
        ProjectManager manager = new ProjectManager(builderSoft) ;
        manager.createSoft();
    }
}

/**
 * 手機軟體產品開發
 */
class MobileSoft {
    // 設計
    private String design ;
    // 架構
    private String frame ;
    // 開發
    private String develop ;
    // 上線
    private String online ;
    // 省略 GET SET 方法
}
/**
 * 手機軟體流程抽象類
 */
abstract class BuilderSoft {
    // 前期工作
    public abstract void earlyWork () ;
    // 中期工作
    public abstract void midWork () ;
    // 後期工作
    public abstract void lateWork () ;
    // 手機軟體完成
    public abstract MobileSoft builderSoft () ;
}

/**
 * 手機軟體具體實現
 */
class SoftImpl extends BuilderSoft {
    private MobileSoft mobileSoft = new MobileSoft();
    @Override
    public void earlyWork() {
        System.out.println("軟體前期設計...");
    }
    @Override
    public void midWork() {
        System.out.println("軟體中期架構...");
        System.out.println("軟體中期開發...");
    }
    @Override
    public void lateWork() {
        System.out.println("軟體後期上線...");
    }
    @Override
    public MobileSoft builderSoft() {
        return mobileSoft ;
    }
}
/**
 * 項目經理:把控項目進度
 */
class ProjectManager {
    private BuilderSoft builderSoft ;
    ProjectManager (BuilderSoft builderSoft){
        this.builderSoft = builderSoft ;
    }
    // 統籌項目周期
    public void createSoft (){
        builderSoft.earlyWork();
        builderSoft.midWork();
        builderSoft.lateWork();
        // MobileSoft mobileSoft = builderSoft.builderSoft() ;
        // return mobileSoft ;
    }
}

2、代碼結構圖

二、建造者模式

1、基礎概念

建造模式是對象的創建模式。建造模式可以將一個產品的內部屬性描述與產品的生產過程分割,從而可以使一個建造過程生成具有不同的內部表象的產品對象。也就是使用一個中介對象封裝一系列的對象交互,使其各個對象不需要顯示的相互調用,而且可以單獨的改變對象之間的交互。

2、核心角色

1)、抽象建造者(Builder)角色

給出一個抽象介面,以規範產品對象的各個組成成分的建造。模式中直接創建產品對象的是具體建造者角色。

2)、具體建造者(ConcreteBuilder)角色

完成的任務包括:1.實現抽象建造者Builder所聲明的介面,給出完成創建產品實例的操作。2.在建造完成後,提供產品的實例。

3)、導演者(Director)角色

擔任這個角色的類調用具體建造者角色以創建產品對象。

4)、產品(Product)角色

產品便是建造的對象。一般來說,一個系統中會有多個產品類,而且這些產品類並不一定有共同的介面,而完全可以是不相關聯的。

3、模式圖解

4、源碼實現

/**
 * 建造者模式代碼
 */
public class C02_Builder {
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);
        director.construct();
        Product product = builder.builderProduct();
        System.out.println(product.getAct1());
        System.out.println(product.getAct2());
    }
}
/**
 * 產品類
 */
class Product {
    /*定義一些產品的操作*/
    private String act1;
    private String act2;
    public String getAct1() {
        return act1;
    }
    public void setAct1(String act1) {
        this.act1 = act1;
    }
    public String getAct2() {
        return act2;
    }
    public void setAct2(String act2) {
        this.act2 = act2;
    }
}
/**
 * Builder 抽象建造者類
 */
abstract class Builder{
    public abstract void builderact1();
    public abstract void builderact2();
    public abstract Product builderProduct();
}
/**
 * 具體建造者類
 */
class ConcreteBuilder extends Builder{
    private Product product = new Product();
    @Override
    public void builderact1() {
        product.setAct1("操作一:執行...");
    }
    @Override
    public void builderact2() {
        product.setAct2("操作二:執行...");
    }
    @Override
    public Product builderProduct() {
        return product;
    }
}
/**
 *  Director 導演者類
 */
class Director{
    /*使用建造者抽象類*/
    private Builder builder;
    Director(Builder builder){
        this.builder = builder;
    }
    /*負責調用各個建造方法*/
    public void construct(){
        builder.builderact1();
        builder.builderact2();
    }
}

三、實際應用

1、JDK中應用

分析

1)、Appendable定義多個append() 抽象方法,抽象建造者。

2)、AbstractStringBuilder實現Appendable介面,已經作為了建造者,只是抽象類無法實例化。

3)、StringBuilder繼承AbstractStringBuilder,即作為具體建造者,也作為指揮者。

2、Spring中應用

源碼實現

// 系列方法
public BeanDefinitionBuilder setParentName(String parentName);
public BeanDefinitionBuilder setFactoryMethod(String factoryMethod);
public BeanDefinitionBuilder setFactoryMethodOnBean(String factoryMethod, String factoryBean);
public BeanDefinitionBuilder addConstructorArgValue(@Nullable Object value);
public BeanDefinitionBuilder addConstructorArgReference(String beanName);
public BeanDefinitionBuilder addPropertyValue(String name, @Nullable Object value);
// 構建Bean
public AbstractBeanDefinition getRawBeanDefinition() {
    return this.beanDefinition;
}
public AbstractBeanDefinition getBeanDefinition() {
    this.beanDefinition.validate();
    return this.beanDefinition;
}

上面兩處建造者模式的實際應用,都有點形散而神不散的感覺。

四、優缺點分析

  • 優點:減少類之間的相互依賴,降低耦合度。
  • 缺點:ConcreateBuilder變得臃腫龐大,邏輯複雜。

五、源代碼地址

GitHub地址:知了一笑
https://github.com/cicadasmile
碼雲地址:知了一笑
https://gitee.com/cicadasmile



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • https://www.datamentor.io/r-programming/data-frame/ Check if a variable is a data frame or not We can check if a variable is a data frame or not using ...
  • 通過實現 Aware 介面,可以在 Spring 啟動時,調用介面定義的方法,將 Spring 底層的一些組件註入到自定義的 Bean 中。 下麵列出了幾個 Spring 在 Aware 介面基礎上,進行擴展的介面,分別會在創建 Bean 時直接執行,或者通過 BeanPostProcessor 間 ...
  • 上一篇博客的最後簡單提了下CommitLog的刷盤 【RocketMQ中Broker的消息存儲源碼分析】 (這篇博客和上一篇有很大的聯繫) Broker的CommitLog刷盤會啟動一個線程,不停地將緩衝區的內容寫入磁碟(CommitLog文件)中,主要分為非同步刷盤和同步刷盤 非同步刷盤又可以分為兩種 ...
  • 一、Format類 1.直接實例化 2.可以繼承Format添加特殊字元 3.三個參數 (1)fmt:指定消息格式化字元串,如果不指定該參數則預設使用message的原始值 (2)datemt:指定日期格式字元串,如果不指定該參數,則預設使用“%Y-%m-%d %H:%M:%S" (3)style: ...
  • 項目進行微信開發, 認證了一個微信服務號專門用於內部測試,但是內部可能存在多套不同環境(開發dev、測試sit、預發佈uat)等,由於微信限制一個服務號只能配置一個網頁授權功能變數名稱, 又不可能給每個環境單獨配一個服務號,這樣不僅需要成本而且很浪費資源, 所以重點需要解決下麵這個問題: 1、可以自動區分環 ...
  • 函數概念: 函數是用來完成某種特定任務的可重用代碼塊; 函數可以使程式更具模塊化,擁有良好的結構; 函數定義後在程式中可以重覆調用; 函數分為內置函數和自定義函數 考點: 變數的作用域和靜態變數 延伸1,函數的參數及參數的引用傳遞。 延伸2,函數的返回值及引用返回。 延伸3,外部文件的導入。 延伸4 ...
  • [TOC] 原文鏈接: "Qt實現表格樹控制項 自繪樹節點虛線" 一、開心一刻 一程式員第一次上女朋友家她媽板著臉問 :你想娶我女兒,有多少存款? 程式員低了下頭:五百! 她媽更鄙視了:才五百塊,買個廁所都不夠! 程式員忙說:不是人民幣! 她媽:就算是美元,還是不夠買廁所! 程式員:其實是比特幣! 她 ...
  • 後端基於方法的許可權控制 Spirng Security 預設情況下, Spring Security 並不啟用方法級的安全管控. 啟用方法級的管控後, 可以針對不同的方法通過註解設置不同的訪問條件;Spring Security 支持三種方法級註解, 分別是 JSR 205/Secured 註解/p ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...