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表示工廠方法所返回的對象類型绩郎。