01、考慮用靜態工廠方法代替構造器
阿新 • • 發佈:2019-02-12
優點
1. 有名稱,當一個類需要多個帶有相同引數的構造器時,就可以用靜態工廠方法代替構造器,並且慎重地選擇名稱以便突出它們之間的區別
例如下邊的有關汽車的類,可以使用三個靜態工廠方法返回不同的汽車
public class Car { private String name; private Car(String name) { this.name = name; } public static Car getFord() { return new Car("Ford"); } public static Car getVolkswagen() { return new Car("Volkswagen"); } public static Car getLamborghini() { return new Car("Lamborghini"); } public String getName() { return this.name; } }
2. 不必在每次呼叫它們的時候都建立一個新物件
單例
確保不可例項化
確保不會存在兩個相等的例項,當且僅當a==b的時候才有a.equals(b)為true,這樣可以用==代替equals方法,提高效能。例如列舉型別
3. 可以返回原返回型別的任何子型別的物件
下邊的例子,利用父類的靜態工廠方法返回三個不同的子類
4. 在建立引數化型別例項的時候,它們使程式碼變得更加簡潔public class Car2 { public static Car2 newFord() { return new Ford(); } public static Car2 newVolkswagen() { return new Volkswagen(); } public static Car2 newLamborghini() { return new Lamborghini(); } } class Ford extends Car2 { public Ford() { System.out.println("Ford"); } } class Volkswagen extends Car2 { public Volkswagen() { System.out.println("Volkswagen"); } } class Lamborghini extends Car2 { public Lamborghini() { System.out.println("Lamborghini"); } }
缺點
1. 類如果不含有公有的或者受保護的構造器,就不能被子類化
2. 與其他的靜態方法實際上沒有任何區別。方法名稱可以各式各樣,例項化的時候有可能會很迷惑
靜態工廠方法的慣用名稱
1. valueOf
2. of
3. getInstance
4. newInstance
5. getType
6. newType