色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:2日期:2022-08-19 16:39:25
背景

假如現(xiàn)在你要想一個(gè)漢堡,有一個(gè)漢堡類: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)麻煩,有沒有更好的解決方法呢?

情景二:不同種類的漢堡

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

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

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

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

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

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

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

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

以上情景問題可以通過靜態(tài)工廠方法來改善。

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

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

class Hamburg{ //獲取奧爾良口味的漢堡 public static Hamburg ofAoErLiang(){ return new AoErLiangHamburg(); } //獲取麥辣香味的漢堡 public static Hamburg ofMaiLaXiang(){ return new MaiLaXiangHamburg(); }}//兩種口味的漢堡,通過繼承漢堡實(shí)現(xiàn)class AoErLiangHamburg extends Hamburg{}class MaiLaXiangHamburg extends Hamburg{}

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

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

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

優(yōu)點(diǎn) 解決構(gòu)造器重載卻不知道各種構(gòu)造器含義的問題。通過構(gòu)造方法可以在方法名寫明,那么用戶只需要通過方法名就知道這個(gè)方法是返回什么對(duì)象。(例如情景一)例如:

//不同的靜態(tài)工廠方法返回不同的實(shí)例,通過方法名就知道他們的區(qū)別//ps:這是android的動(dòng)畫類ObjectAnimator animator = ObjectAnimator.ofFloat();ObjectAnimator animator = ObjectAnimator.ofInt(); 可以通過根據(jù)用戶的參數(shù)或者調(diào)用不同的靜態(tài)工廠方法來返回具體的子類對(duì)象。當(dāng)后期要更換方法接口返回的子類時(shí),對(duì)于用戶來說也是透明的,用戶只是拿到一個(gè)父類引用的對(duì)象。可以參考上面我在介紹靜態(tài)工廠方法舉的例子。

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

重復(fù)利用對(duì)象,防止創(chuàng)建無用實(shí)例。這看起來很像單例,但是比單例要靈活得多。可以根據(jù)具體的情況,來判斷是否要緩存實(shí)例。 可以動(dòng)態(tài)注冊(cè)代碼。我們可以通過一組用戶注冊(cè)api,讓用戶先把需要的自定義代碼注入,再調(diào)用靜態(tài)方法來獲取自己需要的對(duì)象類型。這樣的好處就是不會(huì)有一堆很復(fù)雜的構(gòu)造器,內(nèi)部邏輯也可以分離。對(duì)應(yīng)情景三解決的問題缺點(diǎn) 如果該類不包含public或者protect構(gòu)造器,那么將無法被子類實(shí)例化。因?yàn)槲覀兿胍脩敉ㄟ^靜態(tài)方法來獲取對(duì)象,而不喜歡用戶通過構(gòu)造方法來實(shí)例化對(duì)象。而如果把構(gòu)造器設(shè)置為private,則無法被子類繼承。 無法在javadoc中直接查看文檔介紹,構(gòu)造器是會(huì)直接生成doc的。但是直接通過方法名和參數(shù)名,已經(jīng)可以看懂很多了。 靜態(tài)方法命名規(guī)范 方法名 含義 fromXxx 類型轉(zhuǎn)換 ofXxx 多個(gè)參數(shù)聚合 valueOf 和from of類似 getInstance 獲取一個(gè)實(shí)例,實(shí)例類型通過方法參數(shù)描述 getNewInstance/create 獲取一個(gè)新的實(shí)例 getType 主要用于工廠方法中獲取不同類的對(duì)象(屬于設(shè)計(jì)模式中的工廠方法) newType 新建一個(gè)對(duì)應(yīng)類的對(duì)象(屬于設(shè)計(jì)模式中的工廠方法) type 上面兩者的簡(jiǎn)化版 小結(jié)

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

參考資料

《effective java》

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

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 一级白嫩美女毛片免费 | 免费国产a国产片高清不卡 免费国产不卡午夜福在线 免费国产不卡午夜福在线观看 | 亚洲欧美一区二区三区 | 国产成人黄网址在线视频 | 好湿好紧好痛a级是免费视频 | 国内9l视频自拍 | 青青青青爽视频在线播放 | 国内精品久久久久久网站 | 精品成人免费视频 | 一个人看的免费高清视频日本 | 亚洲图片视频在线 | 亚洲综合日韩欧美一区二区三 | 久草在线播放视频 | 国内一级特黄女人精品片 | 日本a级毛片视频播放 | 亚洲gogo人体大胆西西安徽 | 精品久久国产 | 色偷偷在线刺激免费视频 | 日韩一级片免费 | 免费的三级网站 | 国产孕妇做受视频在线观看 | 久久99国产精品久久99无号码 | 日本精品99 | 欧美午夜不卡在线观看最新 | 成人免费视频一区二区三区 | 奇米第四狠狠777高清秒播 | 日韩一区精品 | 亚洲精品国产经典一区二区 | 老司机亚洲精品 | 久久久久久尹人网香蕉 | 亚洲欧美日韩高清 | 日本高清色视频www 日本高清在线精品一区二区三区 | 国产高清天干天天视频 | 久草视频国产 | 日韩精品中文字幕一区二区三区 | 日韩国产成人资源精品视频 | 男人天堂男人天堂 | 性强烈欧美一级毛片 | 日本波多野结衣视频 | 91啦丨国产丨 | 100000免费啪啪18免进 |