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

首先忧勿,什么是靜態(tài)工廠方法梨撞。一般而言甩骏,如果一個(gè)類需要調(diào)用另一個(gè)類的變量和方法,那么該類需要先獲得另一個(gè)類的實(shí)例栗菜,最常用的的方法就是被調(diào)用類提供一個(gè)公有的構(gòu)造方法。但是蹄梢,還要另外一種方法疙筹,就是被調(diào)用類提供一個(gè)可以返回該類實(shí)例的靜態(tài)方法,該靜態(tài)方法稱為靜態(tài)工廠方法。例如下面的例子(引自《Effective Java》)腌歉,將boolean基本類型值轉(zhuǎn)換成了一個(gè)Boolean對象引用:

public static Boolean valueOf(boolean b) {
    return b ? Boolean.TRUE : Boolean.FALSE;
}

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

1. 和構(gòu)造方法不一樣蛙酪,靜態(tài)工廠方法可以有自己明確的名字。比如newInstance翘盖、getInstance桂塞、valueOf,可以更明確知道這些方法名字的意思馍驯。而構(gòu)造方法只能通過new類名來創(chuàng)建阁危,比如Person person = new Person()

2. 不必沒次調(diào)用時(shí)都創(chuàng)建一個(gè)新對象汰瘫。使用靜態(tài)工廠方法對外提供單例狂打,其實(shí)就是提前準(zhǔn)備好實(shí)例,這樣可以重復(fù)利用混弥,減少重復(fù)創(chuàng)建實(shí)例趴乡,不過這也需要注意線程安全問題。

3. 可以返回原返回類型的任何子類的對象蝗拿。這個(gè)可以這么理解晾捏,例如EnumSet類,EnumSet是抽象類是不能被實(shí)例化的哀托,但是可以通過里面的noneOf靜態(tài)工廠方法返回它子類的對象惦辛,RegularEnumSetJumboEnumSet都是EnumSet的子類,代碼如下:

public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E>
    implements Cloneable, java.io.Serializable {

    EnumSet(Class<E>elementType, Enum[] universe) {}

    public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
        if (universe.length <= 64)
            return new RegularEnumSet<>(elementType, universe);
        else
            return new JumboEnumSet<>(elementType, universe);
    }
}

4.在創(chuàng)建參數(shù)化類型實(shí)例的時(shí)候仓手,它們使代碼變得更加簡潔胖齐。這條可以這么理解,比如在創(chuàng)建一個(gè)Map類型對象時(shí)嗽冒,我們一般可以這么創(chuàng)建:

Map<String, List<String>> m = new HashMap<String, List<String>>();

但是在JDK7以上的版本呀伙,泛型參數(shù)是可以被推導(dǎo)出來的,所以可以有更簡潔的寫法:

Map<String, List<String>> m = new HashMap<>();

或者以后JDK可以提供這樣的寫法辛慰,但目前還不能:

Map<String, List<String>> m = HashMap.newInstance();

雖然標(biāo)準(zhǔn)的集合實(shí)現(xiàn)如HashMap并沒有工廠方法区匠,但我們可以把這樣方法封裝在自己的工具類中。

缺點(diǎn)

1. 類如果不含有公有的或者受保護(hù)的構(gòu)造方法帅腌,就不能被繼承驰弄。如果使用靜態(tài)工廠方法獲得實(shí)例,而不提供公有的構(gòu)造方法速客,把構(gòu)造方法寫為私有private戚篙,那么該類就不能被繼承擴(kuò)展,這就是使用復(fù)合而不是繼承來擴(kuò)展類了溺职。

2.與其他的靜態(tài)方法實(shí)際上沒有任何區(qū)別岔擂。靜態(tài)工廠方法其實(shí)和其他普通的靜態(tài)方法是一樣的位喂,如果沒有加以說明,兩者不能很好被區(qū)分開來乱灵,會(huì)造成使用者不知道怎么獲取該類的實(shí)例塑崖,而且不能清晰查明該類是如何被實(shí)例化的。

簡而言之痛倚,靜態(tài)工廠方法和公有構(gòu)造方法都各有用處规婆,我們需要理解它們各自的長處。靜態(tài)工廠通常更加合適蝉稳,因此切忌第一反應(yīng)就是提供公有的構(gòu)造器抒蚜,而不先考慮靜態(tài)工廠。


參考

《Effective Java 中文版 第2版》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耘戚,一起剝皮案震驚了整個(gè)濱河市嗡髓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌收津,老刑警劉巖饿这,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異撞秋,居然都是意外死亡蛹稍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門部服,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拗慨,你說我怎么就攤上這事廓八。” “怎么了赵抢?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵剧蹂,是天一觀的道長。 經(jīng)常有香客問我烦却,道長宠叼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任其爵,我火速辦了婚禮冒冬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摩渺。我一直安慰自己简烤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布摇幻。 她就那樣靜靜地躺著横侦,像睡著了一般挥萌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上枉侧,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天引瀑,我揣著相機(jī)與錄音,去河邊找鬼榨馁。 笑死憨栽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辆影。 我是一名探鬼主播徒像,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蛙讥!你這毒婦竟也來了锯蛀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤次慢,失蹤者是張志新(化名)和其女友劉穎旁涤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迫像,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡劈愚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闻妓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菌羽。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖由缆,靈堂內(nèi)的尸體忽然破棺而出注祖,到底是詐尸還是另有隱情,我是刑警寧澤均唉,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布是晨,位于F島的核電站,受9級特大地震影響舔箭,放射性物質(zhì)發(fā)生泄漏罩缴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一层扶、第九天 我趴在偏房一處隱蔽的房頂上張望箫章。 院中可真熱鬧,春花似錦怒医、人聲如沸炉抒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焰薄。三九已至拿诸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間塞茅,已是汗流浹背亩码。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留野瘦,地道東北人描沟。 一個(gè)月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像鞭光,于是被迫代替她去往敵國和親吏廉。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容