[Effective Java] (01)靜態(tài)工廠方法代替構造器

1. 創(chuàng)建對象
1.1 構造方法創(chuàng)建對象

在Java中申鱼,創(chuàng)建對象常用的方法是通過公有的構造方法創(chuàng)建愤诱;
如:Boolean類的一個構造函數,可以通過其構造Boolean類的對象捐友;

public Boolean (String s) {
    this(toBoolean(s));
}

//調用
Boolean boolean = new Boolean("true");
1.2 靜態(tài)工廠方法創(chuàng)建對象

類可以提供一個共有的靜態(tài)工廠方法(static factory method)淫半,他只返回類的實例的靜態(tài)方法,他只返回實例匣砖,并不創(chuàng)建實例科吭。如下所示,這個方法將boolean基本類型轉換成一個Boolean對象引用猴鲫;

public static Boolean valueOf(boolean b) {
    return b ? Boolean.TRUE :Boolean.FALSE;
}
1.3 靜態(tài)工廠方法與工廠方法模式區(qū)分

靜態(tài)工廠方法與設計模式中的工廠方法模式不是一個概念:

  • 靜態(tài)工廠方法:通常指某個類中的靜態(tài)方法对人,通過調用該靜態(tài)方法可以得到屬于該類的一個實例;

  • 工廠方法模式:這是一種設計模式拂共,指的是讓具體的工廠對象負責生產具體的產品對象牺弄,這里涉及多種工廠(類),多種對象(類)宜狐,如寶馬工廠生產寶馬對象势告;

  • 靜態(tài)工廠方法跟簡單工廠模式倒有那么點像,不過區(qū)別也挺大抚恒,簡單工廠模式里的靜態(tài)工廠方法會創(chuàng)建各種不同的對象(不同類的實例)咱台,而靜態(tài)工廠方法一般只創(chuàng)建屬于該類的一個實例(包括子類);

2. 靜態(tài)工廠方法的優(yōu)勢
  • 如果構造器參數本身并沒有確切的描述正在被返回的對象柑爸,具有適當名稱的靜態(tài)工廠會更容易使用吵护,產生的客戶端代碼也更易閱讀;當一個類有多個簽名構造器的時候表鳍,可以采用靜態(tài)工廠方法以避免用戶不知道該調用哪個構造器的問題馅而;

  • 不必在每次代用他們的時候都創(chuàng)建一個新的對象,尤其在單例模式中使用非常廣泛譬圣;

  • 可以返回原類型的任何子類型對象瓮恭,主要根據傳入靜態(tài)工程方法的參數來實現,只要是已經聲明過的子類型厘熟,都可以返回得到屯蹦,這為我們選擇返回對象提供了靈活性;如:

//ErHa與Jinmao都是Dog的子類
public static Dog getInstance() {
    return new ErHa();
}
  • 在創(chuàng)建參數化類型實例的時候绳姨,他們使代碼變得更加簡潔;
//在調用參數化類構造器時登澜,即使類參數很明顯,也必須指明飘庄,這通常需要接連兩次提供類型參數脑蠕,如:

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

隨著類型參數變得越來越長,越來越復雜,冗長就變得很麻煩谴仙,有靜態(tài)工廠方法迂求,編譯器就可以替你找到類型參數,被稱為類型推導(type interface)晃跺,如:

public static <K, V> HashMap<K, V> newInstance() {
    return new HashMap<K, V>();
}

//調用
Map<String, List<String>> m = HashMap.newInstance();
3. 靜態(tài)工廠方法的缺點
  • 類如果不含有公有的(public)或受保護的(protected)的構造器就不能被子類化揩局;
  • 他們在與普通的靜態(tài)方法上沒有任何區(qū)別,在Javadoc工具中沒有任何區(qū)別顯示掀虎。
4. 靜態(tài)工廠方法常用的名稱
  • valueOf: 該方法返回的實例與參數具有相同的值凌盯,實際是類型轉換方法;
  • of: valueOf的一種替代涩盾,在EnumSet使用并流行起來十气;
  • getInstance:返回的實例是通過參數進行描述的,不能說與參數具有相同的值春霍,對于Singleton單例模式來說,沒有參數叶眉,返回唯一的實例址儒;
  • newInstance:返回的實例是一個新的實例,與之前返回的都不相同衅疙;
  • getType:與getInstance一樣莲趣,但是在工廠方法處于不同的類時候使用,Type表示工廠方法所返回的對象類型饱溢;
  • newType: 與newInstance一樣喧伞,但是在工廠方法處于不同的類時候使用,Type表示工廠方法所返回的對象類型绩郎。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末潘鲫,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子肋杖,更是在濱河造成了極大的恐慌溉仑,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件状植,死亡現場離奇詭異浊竟,居然都是意外死亡,警方通過查閱死者的電腦和手機津畸,發(fā)現死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門振定,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肉拓,你說我怎么就攤上這事后频。” “怎么了帝簇?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵徘郭,是天一觀的道長靠益。 經常有香客問我,道長残揉,這世上最難降的妖魔是什么胧后? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮抱环,結果婚禮上壳快,老公的妹妹穿的比我還像新娘。我一直安慰自己镇草,他們只是感情好眶痰,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著梯啤,像睡著了一般竖伯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上因宇,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天七婴,我揣著相機與錄音,去河邊找鬼察滑。 笑死打厘,一個胖子當著我的面吹牛,可吹牛的內容都是我干的贺辰。 我是一名探鬼主播户盯,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼饲化!你這毒婦竟也來了莽鸭?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤滓侍,失蹤者是張志新(化名)和其女友劉穎蒋川,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體撩笆,經...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡捺球,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了夕冲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氮兵。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖歹鱼,靈堂內的尸體忽然破棺而出泣栈,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布南片,位于F島的核電站掺涛,受9級特大地震影響,放射性物質發(fā)生泄漏疼进。R本人自食惡果不足惜薪缆,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伞广。 院中可真熱鬧拣帽,春花似錦、人聲如沸嚼锄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽区丑。三九已至拧粪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沧侥,已是汗流浹背既们。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留正什,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓号杏,卻偏偏與公主長得像婴氮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子盾致,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內容