所謂構(gòu)造器即構(gòu)造函數(shù)
公有構(gòu)造器的方式的缺點
- 只能通過new className() 的方式來實現(xiàn)
- 每次調(diào)用必然返回一個新的對象
- 返回類型就是該類
靜態(tài)工廠方法優(yōu)點:
-
靜態(tài)構(gòu)造方法與構(gòu)造器不同在于,它們可以有別名。
解釋:
由于構(gòu)造函數(shù)不能修改函數(shù)名稱,然而函數(shù)的名稱是對于該函數(shù)行為最好的描述,不能修改名稱限制了代碼的可閱讀性。同時如果一個類有需要有兩個相同參數(shù)的構(gòu)造函數(shù),則只能通過改變參數(shù)的順序來達(dá)到目的。我們通過靜態(tài)工廠方法都可以解決以上問題。
例如:
public class People {
private String name;
private Integer age;
private String sex;
public People(String name,Integer age){
this.name = name;
this.age = age;
sex = "男";
}
public People(Integer age,String name){
this.name = name;
this.age = age;
sex = "女";
}
}
public class Test {
public static void main(String[] args) {
//問題很明顯 得通過記住參數(shù)的順序才可以返回正確的people
People man = new People("李雷",20);
People woman = new People(20,"韓梅梅");
}
}
public class People {
private String name;
private Integer age;
private String sex;
private People(String name,Integer age,String sex){
this.name = name;
this.age = age;
this.sex = sex;
}
public static People getMan(String name,Integer age){
People man = new People(name,age,"男");
return man;
}
public static People getWoman(String name,Integer age){
People woman = new People(name,age,"女");
return woman;
}
}
public class Test {
public static void main(String[] args) {
People man = People.getMan("李雷",20);
People woman = People.getWoman("韓梅梅",20);
}
}
-
第二大優(yōu)勢在于不必每次創(chuàng)建一個新的對象
解釋:
每次使用new去調(diào)用構(gòu)造函數(shù)很容易理解,必然產(chǎn)生一個新的對象。
使用靜態(tài)構(gòu)造方法即可控制每次都返回相同的對象。
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton(){
}
public static Singleton getSingleton(){
return singleton;
}
}
-
第三大優(yōu)勢在于可以返回原返回類型的任何子類型的對象
解釋:
優(yōu)勢1.可以隱藏內(nèi)部實現(xiàn),顯得相對智能。
例如:java.util.EnumSet
這個類沒有public的構(gòu)造函數(shù),只有靜態(tài)工廠方法,根據(jù)元素個數(shù)的多少返回不同的子類。對于客戶端,這個是不可見的
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
Enum<?>[] universe = getUniverse(elementType);
if (universe == null)
throw new ClassCastException(elementType + " not an enum");
if (universe.length <= 64)
//對于數(shù)量小有性能優(yōu)勢
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
}
優(yōu)勢2.根據(jù)傳入?yún)?shù)不同返回不同的子類實例
例如傳入案件類別 返回不同的子類案件的實例
- 第四大優(yōu)勢在于,創(chuàng)建帶有泛型的實例時可以更簡便
直接上例子:
復(fù)雜版
Map<String,List<String>> map = new HashMap<String,List<String>>();
簡單版
//如果我們提供一個靜態(tài)工廠類
public static <K,V> HashMap<K,V> newInstance(){
return new HashMap<K,V>();
}
Map<String,List<String>> map = HashMap.newInstance();
缺點:
- api中沒有不會明確的說明靜態(tài)代理類是用于實例化的,而構(gòu)造函數(shù)會有明確的標(biāo)識
2.由于使用了靜態(tài)工廠方法來實例化,我們會將類的構(gòu)造函數(shù)私有化,從而導(dǎo)致該類無法被繼承。但也不完全是缺點,畢竟組合比繼承耦合度更低。