最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java 靜態(tài)工廠(chǎng)代替多參構(gòu)造器的適用情況與優(yōu)劣

 更新時(shí)間:2020年12月09日 14:23:07   作者:HuanBlog  
這篇文章主要介紹了java 靜態(tài)工廠(chǎng)代替多參構(gòu)造器的優(yōu)劣,幫助大家更好的理解和使用靜態(tài)工廠(chǎng)方法,感興趣的朋友可以了解下

背景

假如現(xiàn)在你要想一個(gè)漢堡,有一個(gè)漢堡類(lèi):Hamburg。那么一般情況下你會(huì):

Hamburg hamburg = new Hamburg();

情景一:不同參數(shù)數(shù)目的構(gòu)造器

制作漢堡可以選擇自定義,加肉,加菜,或者不添加,直接默認(rèn)配方即可,那么會(huì)有以下幾個(gè)構(gòu)造器:

Hamburg();
Hamburg(Meat meat);
Hamburg(Meat meat,Vegetable vegetable);

當(dāng)你要制作漢堡的時(shí)候,看到這么多的構(gòu)造器,但是卻不知道他們是什么意思,返回的漢堡到底有什么區(qū)別?查文檔又有點(diǎn)麻煩,有沒(méi)有更好的解決方法呢?

情景二:不同種類(lèi)的漢堡

如果有多種漢堡:新奧爾良漢堡,麥辣香漢堡。常規(guī)的做法就是:繼承漢堡類(lèi),實(shí)現(xiàn)子類(lèi),如:

class xinaoerliangHamburg extends Hamburg{}
class mailaHamburg extends Hamburg{}

但是會(huì)有問(wèn)題:用戶(hù)在使用的時(shí)候,還得記住你那么多類(lèi)名,那是不是很麻煩?如果后續(xù)有更多的口味,那是不是要記住更多地類(lèi)去才能得到對(duì)應(yīng)的實(shí)例呢?有沒(méi)有更好的解決方法?

情景三:自定義漢堡的做法

如果漢堡的手法讓你非常不滿(mǎn)意,你想要用達(dá)芬奇技法來(lái)制作漢堡,那么可以怎么做呢?常規(guī)的做法是:

class Hamburg{
 ...
 //默認(rèn)制作手法 
 private Maker mMaker = new DefaultMaker(); 
 public Hamburg(Maker maker){
  ...
  //使用傳進(jìn)來(lái)的手法對(duì)象制作漢堡
  mMaker = maker;
  ...
 }
}

需要重新寫(xiě)一個(gè)構(gòu)造器,傳入?yún)?shù)來(lái)覆蓋原來(lái)的制作手法。這樣既有情景一的問(wèn)題,還有另外的問(wèn)題是:如果需要自定義的東西多的時(shí)候,那么Hamburg里需要維護(hù)的代碼就更加的復(fù)雜了。

什么是靜態(tài)工廠(chǎng)方法

以上情景問(wèn)題可以通過(guò)靜態(tài)工廠(chǎng)方法來(lái)改善。

注意,這里的靜態(tài)工廠(chǎng)方法并不是設(shè)計(jì)模式中的工廠(chǎng)模式。這里只是使用靜態(tài)工廠(chǎng)方法來(lái)代替構(gòu)造器實(shí)例化對(duì)象。

顧名思義,靜態(tài)工廠(chǎng)方法,就是使用靜態(tài)方法來(lái)構(gòu)建類(lèi)的實(shí)例,解決使用構(gòu)造器實(shí)例化的各種問(wèn)題。先看個(gè)例子,還是以上面的漢堡為例子,如果需要多種口味的漢堡,那么可以:

class Hamburg{

 //獲取奧爾良口味的漢堡
 public static Hamburg ofAoErLiang(){
  return new AoErLiangHamburg();
 }
 //獲取麥辣香味的漢堡
 public static Hamburg ofMaiLaXiang(){
  return new MaiLaXiangHamburg();
 }
}

//兩種口味的漢堡,通過(guò)繼承漢堡實(shí)現(xiàn)
class AoErLiangHamburg extends Hamburg{}
class MaiLaXiangHamburg extends Hamburg{}

通過(guò)這種方法可以解決的是:用戶(hù)需要什么類(lèi)型的漢堡,可以直接通過(guò)Hamburg的靜態(tài)方法來(lái)獲取,而無(wú)需知道他的子類(lèi)名字是什么。而如果有更多種口味的漢堡,只需要擴(kuò)展靜態(tài)方法即可;或者給靜態(tài)方法增加參數(shù),通過(guò)switch來(lái)返回對(duì)應(yīng)的口味漢堡。

靜態(tài)工廠(chǎng)優(yōu)缺點(diǎn)

這里的話(huà)會(huì)結(jié)合上面舉的例子,如果忘記了,看到可以返回去看一下。

優(yōu)點(diǎn)

  • 解決構(gòu)造器重載卻不知道各種構(gòu)造器含義的問(wèn)題。通過(guò)構(gòu)造方法可以在方法名寫(xiě)明,那么用戶(hù)只需要通過(guò)方法名就知道這個(gè)方法是返回什么對(duì)象。(例如情景一)例如:
//不同的靜態(tài)工廠(chǎng)方法返回不同的實(shí)例,通過(guò)方法名就知道他們的區(qū)別
//ps:這是android的動(dòng)畫(huà)類(lèi)
ObjectAnimator animator = ObjectAnimator.ofFloat();
ObjectAnimator animator = ObjectAnimator.ofInt();
  • 可以通過(guò)根據(jù)用戶(hù)的參數(shù)或者調(diào)用不同的靜態(tài)工廠(chǎng)方法來(lái)返回具體的子類(lèi)對(duì)象。當(dāng)后期要更換方法接口返回的子類(lèi)時(shí),對(duì)于用戶(hù)來(lái)說(shuō)也是透明的,用戶(hù)只是拿到一個(gè)父類(lèi)引用的對(duì)象??梢詤⒖忌厦嫖以诮榻B靜態(tài)工廠(chǎng)方法舉的例子。

Java 8以上,可以在接口中定義靜態(tài)工廠(chǎng)方法,這樣無(wú)需知道該接口有多少個(gè)實(shí)現(xiàn)類(lèi),只需要根據(jù)靜態(tài)方法來(lái)獲取接口對(duì)象即可。

  • 重復(fù)利用對(duì)象,防止創(chuàng)建無(wú)用實(shí)例。這看起來(lái)很像單例,但是比單例要靈活得多??梢愿鶕?jù)具體的情況,來(lái)判斷是否要緩存實(shí)例。
  • 可以動(dòng)態(tài)注冊(cè)代碼。我們可以通過(guò)一組用戶(hù)注冊(cè)api,讓用戶(hù)先把需要的自定義代碼注入,再調(diào)用靜態(tài)方法來(lái)獲取自己需要的對(duì)象類(lèi)型。這樣的好處就是不會(huì)有一堆很復(fù)雜的構(gòu)造器,內(nèi)部邏輯也可以分離。對(duì)應(yīng)情景三解決的問(wèn)題

缺點(diǎn)

  1. 如果該類(lèi)不包含public或者protect構(gòu)造器,那么將無(wú)法被子類(lèi)實(shí)例化。因?yàn)槲覀兿胍脩?hù)通過(guò)靜態(tài)方法來(lái)獲取對(duì)象,而不喜歡用戶(hù)通過(guò)構(gòu)造方法來(lái)實(shí)例化對(duì)象。而如果把構(gòu)造器設(shè)置為private,則無(wú)法被子類(lèi)繼承。
  2. 無(wú)法在javadoc中直接查看文檔介紹,構(gòu)造器是會(huì)直接生成doc的。但是直接通過(guò)方法名和參數(shù)名,已經(jīng)可以看懂很多了。

靜態(tài)方法命名規(guī)范

方法名 含義
fromXxx  類(lèi)型轉(zhuǎn)換
ofXxx 多個(gè)參數(shù)聚合
valueOf 和from of類(lèi)似
getInstance  獲取一個(gè)實(shí)例,實(shí)例類(lèi)型通過(guò)方法參數(shù)描述
getNewInstance/create 獲取一個(gè)新的實(shí)例
getType 主要用于工廠(chǎng)方法中獲取不同類(lèi)的對(duì)象(屬于設(shè)計(jì)模式中的工廠(chǎng)方法)
newType 新建一個(gè)對(duì)應(yīng)類(lèi)的對(duì)象(屬于設(shè)計(jì)模式中的工廠(chǎng)方法)
type  上面兩者的簡(jiǎn)化版

小結(jié)

在有多種子類(lèi)或者重載構(gòu)造器的時(shí)候,可以?xún)?yōu)先考慮一下靜態(tài)工廠(chǎng)方法,可以讓我們的代碼更加地優(yōu)雅,也方便我們進(jìn)行維護(hù)。
另外這和設(shè)計(jì)模式中的工廠(chǎng)模式有區(qū)別,并不是一樣的,要進(jìn)行區(qū)分。

參考資料

effective java

以上就是java 靜態(tài)工廠(chǎng)代替多參構(gòu)造器的詳細(xì)內(nèi)容,更多關(guān)于java 靜態(tài)工廠(chǎng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳談java集合框架

    詳談java集合框架

    這篇文章主要介紹了詳談java集合框架 ,需要的朋友可以參考下
    2015-05-05
  • tk.Mybatis 插入數(shù)據(jù)獲取Id問(wèn)題

    tk.Mybatis 插入數(shù)據(jù)獲取Id問(wèn)題

    本文主要介紹了tk.Mybatis 插入數(shù)據(jù)獲取Id問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • mybatis-plus添加數(shù)據(jù)時(shí)id自增問(wèn)題及解決

    mybatis-plus添加數(shù)據(jù)時(shí)id自增問(wèn)題及解決

    這篇文章主要介紹了mybatis-plus添加數(shù)據(jù)時(shí)id自增問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 解決spring security中遇到的問(wèn)題

    解決spring security中遇到的問(wèn)題

    這篇文章主要介紹了解決spring security中遇到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Java黑科技:replace首個(gè)替換一秒搞定

    Java黑科技:replace首個(gè)替換一秒搞定

    要實(shí)現(xiàn)只替換第一個(gè)匹配項(xiàng),可以使用Java中的String類(lèi)的replaceFirst方法,該方法接受兩個(gè)參數(shù),第一個(gè)參數(shù)是要替換的字符串或正則表達(dá)式,第二個(gè)參數(shù)是替換后的字符串,需要的朋友可以參考下
    2023-10-10
  • Mybatis plus關(guān)閉駝峰命名的四種方法(防止出現(xiàn)查詢(xún)?yōu)镹ull)

    Mybatis plus關(guān)閉駝峰命名的四種方法(防止出現(xiàn)查詢(xún)?yōu)镹ull)

    這篇文章主要介紹了Mybatis plus關(guān)閉駝峰命名的四種方法(防止出現(xiàn)查詢(xún)?yōu)镹ull),數(shù)據(jù)庫(kù)的字段命名方式為使用下劃線(xiàn)連接,對(duì)應(yīng)的實(shí)體類(lèi)應(yīng)該是駝峰命名方式,而我使用的是和數(shù)據(jù)庫(kù)同樣的命名方式,需要的朋友可以參考下
    2022-01-01
  • java實(shí)現(xiàn)簡(jiǎn)單QQ登錄界面

    java實(shí)現(xiàn)簡(jiǎn)單QQ登錄界面

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單QQ登錄界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Springboot中分析SQL性能的兩種方式詳解

    Springboot中分析SQL性能的兩種方式詳解

    文章介紹了SQL性能分析的兩種方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置簡(jiǎn)單,適用于開(kāi)發(fā)和測(cè)試環(huán)境,但高版本已棄用;p6spy框架功能更強(qiáng)大,可以自定義日志輸出格式,但在生產(chǎn)環(huán)境中使用需謹(jǐn)慎,感興趣的朋友一起看看吧
    2025-02-02
  • 解析Java的Spring框架的基本結(jié)構(gòu)

    解析Java的Spring框架的基本結(jié)構(gòu)

    這篇文章主要介紹了Java的Spring框架的基本結(jié)構(gòu),作者從Spring的設(shè)計(jì)角度觸發(fā)解析其基礎(chǔ)的架構(gòu)內(nèi)容,需要的朋友可以參考下
    2016-03-03
  • Java利用jenkins做項(xiàng)目的自動(dòng)化部署

    Java利用jenkins做項(xiàng)目的自動(dòng)化部署

    這篇文章主要介紹了Java利用jenkins做項(xiàng)目的自動(dòng)化部署,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06

最新評(píng)論

崇文区| 家居| 财经| 永登县| 仲巴县| 江陵县| 宁强县| 祁门县| 鄂托克旗| 教育| 余干县| 岚皋县| 浦城县| 花莲市| 宜昌市| 榕江县| 公主岭市| 宜良县| 东丽区| 高邑县| 定南县| 安康市| 洪江市| 广饶县| 清新县| 蒙自县| 新丰县| 淮滨县| 霍林郭勒市| 三穗县| 赣州市| 长武县| 方正县| 崇左市| 长治县| 鹤峰县| 观塘区| 永顺县| 昌宁县| 肇东市| 南溪县|