欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java設計模式之建造者模式淺析示例

 更新時間:2022年11月28日 11:54:08   作者:lpf_wei  
建造者模式,是一種對象構建模式 它可以將復雜對象的建造過程抽象出來,使這個抽象過程的不同實現方法可以構造出不同表現的對象。本文將通過示例講解建造者模式,需要的可以參考一下

編程是一門藝術,大批量的改動顯然是非常丑陋的做法,用心的琢磨寫的代碼讓它變的更美觀。

1.建造者(Builder)設計模式定義

建造者設計模式是指將一個復雜對象的構造與它的表示分離,使同樣的構建過程可以創(chuàng)建不同的表示,這樣的被稱為建造者模式。

它是將一個復雜的對象分解為多個簡單的對象,然后一步一步構建而成。它將變與不變相分離,即產品的組成部分是不變的,但每一部分是可以靈活選擇的。

2.建造者設計模式優(yōu)點

  • 封裝性好,構建和表示分離。
  • 擴展性好,各個具體的建造者相互獨立,有利于系統(tǒng)的解耦。
  • 客戶端不必知道產品內部組成的細節(jié),建造者可以對創(chuàng)建過程逐步細化,而不對其它模塊產生任何影響,便于控制細節(jié)風險。

3.建造者設計模式不足之處

  • 產品的組成部分必須相同,這限制了其使用范圍。
  • 如果產品的內部變化復雜,如果產品內部發(fā)生變化,則建造者也要同步修改,后期維護成本較大。

4.建造者設計模式角色關系

建造者(Builder)模式由產品、抽象建造者、具體建造者、指揮者等 4 個要素構成。

  • 產品角色(Product):它是包含多個組成部件的復雜對象,由具體建造者來創(chuàng)建其各個零部件。
  • 抽象建造者(Builder):它是一個包含創(chuàng)建產品各個子部件的抽象方法的接口,通常還包含一個返回復雜產品的方法 getResult()。
  • 具體建造者(Concrete Builder):實現 Builder 接口,完成復雜產品的各個部件的具體創(chuàng)建方法。
  • 指揮者(Director):它調用建造者對象中的部件構造與裝配方法完成復雜對象的創(chuàng)建,在指揮者中不涉及具體產品的信息。

5.建造者設計模式應用

建造者設計模式應用非常廣泛,比如Retrofit、AlertDialog等都使用了建造者設計模式。

下面使用Retrofit刪減版本當作示例(這是一個開源項目的真實場景,更加貼近真實的應用)

public final class Retrofit {
      Retrofit(
      	okhttp3.Call.Factory callFactory,
     	HttpUrl baseUrl,
      	List<Converter.Factory> converterFactories,
      	int defaultConverterFactoriesSize,
      	List<CallAdapter.Factory> callAdapterFactories,
      	int defaultCallAdapterFactoriesSize,
      	@Nullable Executor callbackExecutor,
      	boolean validateEagerly) {
    		this.callFactory = callFactory;
   		 this.baseUrl = baseUrl;
   		 this.converterFactories = converterFactories;  
    	 this.defaultConverterFactoriesSize = defaultConverterFactoriesSize;
   		 this.callAdapterFactories = callAdapterFactories; 
    	 this.defaultCallAdapterFactoriesSize = defaultCallAdapterFactoriesSize;
         this.callbackExecutor = callbackExecutor;
         this.validateEagerly = validateEagerly;
 	 }
      public static final class Builder {
      		 public Builder() {}
             public Builder baseUrl(URL baseUrl) {
      			Objects.requireNonNull(baseUrl, "baseUrl == null");
     		 	return baseUrl(HttpUrl.get(baseUrl.toString()));
    		}
          public Builder addCallAdapterFactory(CallAdapter.Factory factory) {
      			callAdapterFactories.add(Objects.requireNonNull(factory, "factory 					== null"));
      			return this;
    		}
             public Builder addConverterFactory(Converter.Factory factory) 	{
      				converterFactories.add(Objects.requireNonNull(factory, "factory == 						null"));
      				return this;
   			 }
    		public Retrofit build() {
    			if (baseUrl == null) {
       		 		throw new IllegalStateException("Base URL required.");
      			}
      			Platform platform = Platform.get();
     			okhttp3.Call.Factory callFactory = this.callFactory;
      			if (callFactory == null) {
        			callFactory = new OkHttpClient();
     		 	}
      			Executor callbackExecutor = this.callbackExecutor;
      			if (callbackExecutor == null) {
        			callbackExecutor = platform.defaultCallbackExecutor();
      			}
      			converterFactories.add(new BuiltInConverters());
      			converterFactories.addAll(this.converterFactories);
      			converterFactories.addAll(defaultConverterFactories);
     		 return new Retrofit(
          		baseUrl,
          		unmodifiableList(converterFactories),
          		defaultConverterFactoriesSize,
          		unmodifiableList(callAdapterFactories),
          		defaultCallAdapterFactories.size(),
          		callbackExecutor,
          		validateEagerly);
    		}
  		}
     }
}
//Retrofit 對象的創(chuàng)建
 Retrofit retrofit =
        new Retrofit.Builder()
            .baseUrl(API_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

Retrifit官網地址:https://github.com/square/retrofit

以上內容做了刪減,只為說明建造者設計模式,以上例子中產品角色就是Retrofit,這里Builder就是具體的建造者,當用戶使用的時候,只需要通過建造者設置具體屬性,比如URL、ConverterFactory等,然后調用build方法就可以創(chuàng)建Retrofit對象。

在案例中可以看到,除了URL是必須要添加的之外,其他的都是有默認值的,如果不設置也沒有問題。這樣就可以通過設置不同的參數,創(chuàng)建出各種各樣的Retrofit對象了,靈活方便。

建造者模式在應用過程中可以根據需要改變,如果創(chuàng)建的產品種類只有一種,只需要一個具體建造者,這時可以省略掉抽象建造者,甚至可以省略掉指揮者角色。以上就是這樣的案例。

6.建造者設計模式的應用場景

建造者模式唯一區(qū)別于工廠模式的是針對復雜對象的創(chuàng)建。也就是說,如果創(chuàng)建簡單對象,通常都是使用工廠模式進行創(chuàng)建,而如果創(chuàng)建復雜對象,就可以考慮使用建造者模式。

當需要創(chuàng)建的產品具備復雜創(chuàng)建過程時,可以抽取出共性創(chuàng)建過程,然后交由具體實現類自定義創(chuàng)建流程,使得同樣的創(chuàng)建行為可以生產出不同的產品,分離了創(chuàng)建與表示,使創(chuàng)建產品的靈活性大大增加。

建造者模式主要適用于以下應用場景:

  • 相同的方法,不同的執(zhí)行順序,產生不同的結果。
  • 多個部件或零件,都可以裝配到一個對象中,但是產生的結果又不相同。
  • 產品類非常復雜,或者產品類中不同的調用順序產生不同的作用。
  • 初始化一個對象特別復雜,參數多,而且很多參數都具有默認值。

到此這篇關于Java設計模式之建造者模式淺析示例的文章就介紹到這了,更多相關Java建造者模式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot web開發(fā)源碼深入分析

    SpringBoot web開發(fā)源碼深入分析

    Web開發(fā)的核心內容主要包括內嵌的Servlet容器和SpringMVCSpringBoot使用起來非常簡潔,大部分配置都有SpringBoot自動裝配,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-10-10
  • 使用@RequestBody配合@Valid校驗入參參數

    使用@RequestBody配合@Valid校驗入參參數

    這篇文章主要介紹了使用@RequestBody配合@Valid校驗入參參數,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 將SpringBoot的Jar注冊成Windows服務的實現方法

    將SpringBoot的Jar注冊成Windows服務的實現方法

    當前項目有個地圖編輯器,后端用的是SpringBoot框架,外網剛好有一臺空閑的Windows服務器就直接拿來用了,將Java程序部署成Windows服務可以用WinSW (Windows Service Wrapper)來實現,文中有詳細的操作步驟,需要的朋友可以參考下
    2023-11-11
  • 一次詭異的full gc查找問題全過程

    一次詭異的full gc查找問題全過程

    這篇文章主要給大家分享介紹了一次詭異的full gc查找問題全部過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧啊
    2018-11-11
  • 關于mybatis3中@SelectProvider的使用問題

    關于mybatis3中@SelectProvider的使用問題

    這篇文章主要介紹了mybatis3中@SelectProvider的使用技巧,@SelectProvide指定一個Class及其方法,并且通過調用Class上的這個方法來獲得sql語句,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2021-12-12
  • Java?Spring框架創(chuàng)建項目與Bean的存儲與讀取詳解

    Java?Spring框架創(chuàng)建項目與Bean的存儲與讀取詳解

    本篇文章將介紹Spring項目的創(chuàng)建,IDEA國內源的配置以及Bean的存儲與讀取,所謂的Bean其實就是對象的意思,更詳細地說Spring Bean是被實例的,組裝的及被Spring 容器管理的Java對象
    2022-07-07
  • 利用java制作簡單的音樂播放器

    利用java制作簡單的音樂播放器

    這篇文章主要為大家詳細介紹了利用java的swing技術制作簡單的音樂播放器,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 用Maven打成可執(zhí)行jar,包含maven依賴,本地依賴的操作

    用Maven打成可執(zhí)行jar,包含maven依賴,本地依賴的操作

    這篇文章主要介紹了用Maven打成可執(zhí)行jar,包含maven依賴,本地依賴的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Mybatis枚舉類型轉換源碼分析

    Mybatis枚舉類型轉換源碼分析

    在Mybatis的TypeHandlerRegistry中,添加了常用的類轉換器,其中默認的枚舉類型轉換器是EnumTypeHandler,這篇文章主要介紹了Mybatis枚舉類型轉換源碼分析,需要的朋友可以參考下
    2024-05-05
  • Java實現實時監(jiān)控目錄下文件變化的方法

    Java實現實時監(jiān)控目錄下文件變化的方法

    今天小編就為大家分享一篇關于Java實現實時監(jiān)控目錄下文件變化的方法,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03

最新評論