所謂構造器即構造函數(shù)
公有構造器的方式的缺點
- 只能通過new className() 的方式來實現(xiàn)
- 每次調用必然返回一個新的對象
- 返回類型就是該類
靜態(tài)工廠方法優(yōu)點:
-
靜態(tài)構造方法與構造器不同在于听怕,它們可以有別名唇跨。
解釋:
由于構造函數(shù)不能修改函數(shù)名稱获三,然而函數(shù)的名稱是對于該函數(shù)行為最好的描述,不能修改名稱限制了代碼的可閱讀性险毁。同時如果一個類有需要有兩個相同參數(shù)的構造函數(shù)霍衫,則只能通過改變參數(shù)的順序來達到目的候引。我們通過靜態(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去調用構造函數(shù)很容易理解敦跌,必然產生一個新的對象澄干。
使用靜態(tài)構造方法即可控制每次都返回相同的對象。
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton(){
}
public static Singleton getSingleton(){
return singleton;
}
}
-
第三大優(yōu)勢在于可以返回原返回類型的任何子類型的對象
解釋:
優(yōu)勢1.可以隱藏內部實現(xiàn)柠傍,顯得相對智能麸俘。
例如:java.util.EnumSet
這個類沒有public的構造函數(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)建帶有泛型的實例時可以更簡便
直接上例子:
復雜版
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)代理類是用于實例化的拜效,而構造函數(shù)會有明確的標識
2.由于使用了靜態(tài)工廠方法來實例化,我們會將類的構造函數(shù)私有化各谚,從而導致該類無法被繼承紧憾。但也不完全是缺點,畢竟組合比繼承耦合度更低昌渤。