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