摘要:工廠方法模式工廠方法模式是一種設(shè)計(jì)模式,指的是讓具體的工廠對(duì)象負(fù)責(zé)生產(chǎn)具體的產(chǎn)品對(duì)象。在我們使用構(gòu)造函數(shù)創(chuàng)建對(duì)象的時(shí)候,我們每次時(shí),都將創(chuàng)建一個(gè)新的對(duì)象,而如果我們通過(guò)靜態(tài)工廠方法時(shí),我們可以返回系統(tǒng)中已存在的對(duì)象。
目錄:
普通構(gòu)造方法與靜態(tài)工廠方法
靜態(tài)工廠方法與設(shè)計(jì)模式中的工廠方法區(qū)別
靜態(tài)工廠方法的優(yōu)勢(shì)
靜態(tài)工廠方法的缺點(diǎn)
普通構(gòu)造方法與靜態(tài)工廠方法
普通構(gòu)造方法創(chuàng)建對(duì)象:
在Java中我們通常都是通過(guò)公有的構(gòu)造方法來(lái)創(chuàng)建對(duì)象(即通過(guò)new+類名()的方式創(chuàng)建),例如:
通過(guò)靜態(tài)工廠方法創(chuàng)建對(duì)象:
一般是指我們將對(duì)象中的某個(gè)方法的修飾符設(shè)置為static的,通過(guò)這個(gè)方法返回我們所需要的對(duì)象,例如:
在Boolean這個(gè)類中,我們通過(guò)valueOf()這個(gè)靜態(tài)工廠方法返回內(nèi)部已生成的對(duì)象(后文解釋)。
靜態(tài)工廠方法與設(shè)計(jì)模式中的工廠方法區(qū)別
靜態(tài)工廠方法:靜態(tài)工廠方法是通過(guò)調(diào)用類中某個(gè)靜態(tài)方法從而得到該類或者其子類對(duì)象的一個(gè)方法,與我們常說(shuō)的設(shè)計(jì)模式中的工廠方法不同。
工廠方法模式:工廠方法模式是一種設(shè)計(jì)模式,指的是讓具體的工廠對(duì)象負(fù)責(zé)生產(chǎn)具體的產(chǎn)品對(duì)象。
主要區(qū)別:工廠方法模式里的靜態(tài)工廠方法會(huì)創(chuàng)建各種不同的對(duì)象(不同類的實(shí)例),而靜態(tài)工廠方法一般只創(chuàng)建屬于該類的一個(gè)實(shí)例或者子類實(shí)例;
靜態(tài)工廠方法的優(yōu)勢(shì)
知其名明其義:
假設(shè)我們要通過(guò)Number類獲得一個(gè)某個(gè)區(qū)間的素?cái)?shù),代碼如下:
通過(guò)這種方式,我們不難發(fā)現(xiàn)上面代碼可讀性差,如果我們不通過(guò)文檔幫助,我們根本不知道Number(int min)和Number(int min,int max)這兩個(gè)構(gòu)造函數(shù)之間的區(qū)別,而如果我們通過(guò)靜態(tài)工廠方式可以大大提高程序的可讀性,做到知道該函數(shù)的名字,就能明白該函數(shù)所要完成的功能,代碼如下:
調(diào)用靜態(tài)工廠方法沒(méi)必要每次都創(chuàng)建新的對(duì)象:
在開(kāi)發(fā)過(guò)程中,當(dāng)我們生成一個(gè)對(duì)象要浪費(fèi)掉系統(tǒng)很多資源或者需要較長(zhǎng)的時(shí)間來(lái)創(chuàng)建對(duì)象時(shí),我們往往喜歡通過(guò)單例來(lái)解決系統(tǒng)的開(kāi)銷。在我們使用構(gòu)造函數(shù)創(chuàng)建對(duì)象的時(shí)候,我們每次new時(shí),都將創(chuàng)建一個(gè)新的對(duì)象,而如果我們通過(guò)靜態(tài)工廠方法時(shí),我們可以返回系統(tǒng)中已存在的對(duì)象。例如Boolean就是這樣實(shí)現(xiàn)的:
當(dāng)虛擬機(jī)加載Boolean類的時(shí)候,我們將生成兩個(gè)常量TRUE和FALSE,如系統(tǒng)需要再次生成時(shí),直接返回該常量,無(wú)需再次生成。
可以返回原返回類型的任何子類型的對(duì)象:
在普通構(gòu)造方法中,我們生成的對(duì)象是該類的對(duì)象,而在靜態(tài)工廠方法中,我們可以生成該類的子類對(duì)象,代碼如下:
使代碼更為簡(jiǎn)潔:
在我們調(diào)用參數(shù)話類的構(gòu)造器時(shí),即使類型參數(shù)很明顯,我們也必須指出:
但是有了靜態(tài)工廠方法,編譯器就可以替我們找到類型參數(shù):
靜態(tài)工廠方法的缺點(diǎn)
類如果不包含公有的或者受保護(hù)的構(gòu)造器,就不能被子類繼承(繼承也沒(méi)用,因?yàn)樵趯?shí)例化子類時(shí),要首先實(shí)例化父類)
與其它普通靜態(tài)方法沒(méi)有區(qū)別, 所以,一般一個(gè)靜態(tài)工廠方法需要有詳細(xì)的注釋,遵守標(biāo)準(zhǔn)的命名,如使用getInstance、valueOf、newInstance等方法名
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67947.html
摘要:提供靜態(tài)工廠方法而不是公共構(gòu)造函數(shù)既有優(yōu)點(diǎn)也有缺點(diǎn)。它們不像構(gòu)造函數(shù)那樣在文檔中脫穎而出,因此很難弄清楚如何實(shí)例化提供靜態(tài)工廠方法而不是構(gòu)造函數(shù)的類。 ??類允許客戶端獲取實(shí)例的傳統(tǒng)方法是提供公共構(gòu)造器。還有一種技術(shù)應(yīng)該是每個(gè)程序員的工具箱的一部分。一個(gè)類可以提供一個(gè)公共靜態(tài)工廠方法,它僅僅是一個(gè)返回類實(shí)例的靜態(tài)方法。下面是布爾(布爾型的盒裝原語(yǔ)類)的一個(gè)簡(jiǎn)單示例。這個(gè)方法將一個(gè)布爾原...
摘要:構(gòu)造方法是在對(duì)象實(shí)例初始化過(guò)程中具有舉足輕重的地位,并且提供了多種方式來(lái)定義構(gòu)造方法。在中創(chuàng)建對(duì)象的開(kāi)銷是相當(dāng)?shù)偷?,并且速度很快。?duì)象終結(jié)器前面我們講述的都是構(gòu)造方法和對(duì)象初始化相關(guān)的主題,但還未提及他們的反面對(duì)象銷毀。 原文鏈接:http://www.javacodegeeks.com/2015/09/how-to-create-and-destroy-objects.html 本文...
摘要:因此,最好一開(kāi)始就考慮使用構(gòu)造器。與使用傳統(tǒng)的重疊構(gòu)造器模式相比,使用模式的客戶端代碼更易于閱讀和編寫,構(gòu)建器也比更加安全。 ??靜態(tài)工廠和構(gòu)造器有個(gè)共同的局限性:他們都不能很好地?cái)U(kuò)展到大量的可選參數(shù)??紤]用一個(gè)類表示包裝食品外面顯示的營(yíng)養(yǎng)成分標(biāo)簽。這些標(biāo)簽中有幾個(gè)域是必需的:每份的含量、每罐的含量以及每份的卡路里,還有超過(guò)20個(gè)可選域:總脂肪、飽和脂肪量、轉(zhuǎn)化脂肪、膽固醇、鈉等等。大...
摘要:來(lái)源前條來(lái)源一書英文版已經(jīng)出版,這本書的第二版想必很多人都讀過(guò),號(hào)稱四大名著之一,不過(guò)第二版年出版,到現(xiàn)在已經(jīng)將近年的時(shí)間,但隨著,,,甚至的發(fā)布,語(yǔ)言發(fā)生了深刻的變化。譯者在這里第一時(shí)間翻譯成中文版。供大家學(xué)習(xí)分享之用。 來(lái)源:sjsdfg/effective-java-3rd-chinese前 51 條來(lái)源:Effective Java, Third Edition 《Effec...
摘要:但由于模式本身有嚴(yán)重的缺陷,由于構(gòu)造方法在多次調(diào)用中被分割,導(dǎo)致可能處于不一致的狀態(tài),并且還需要額外增加工作以確保線程安全。方法必須遵從類指定的常規(guī)約定,將不同的哈希碼分配給不同的實(shí)例對(duì)象。 1.使用靜態(tài)工廠方法替代構(gòu)造方法 靜態(tài)工廠方法的優(yōu)點(diǎn): 不像構(gòu)造方法,它是有名字的。 它不需要每次調(diào)用時(shí)都創(chuàng)建一個(gè)新對(duì)象。 它可以返回 其返回類型的任何子類型的對(duì)象。 返回對(duì)象的類可以根...
閱讀 1283·2021-10-11 10:57
閱讀 2054·2021-09-02 15:15
閱讀 1614·2019-08-30 15:56
閱讀 1206·2019-08-30 15:55
閱讀 1164·2019-08-30 15:44
閱讀 989·2019-08-29 12:20
閱讀 1335·2019-08-29 11:12
閱讀 1074·2019-08-28 18:29