有效的Java說 「考慮提供靜態工廠方法代替構造函數」如何使用「靜態工廠方法」而不是構造函數?
如果你有
class A {
public static A getInstance() {
return new A();
}
}
是否有意義提供A類此方法,而不是調用new A()在代碼中。
有效的Java說 「考慮提供靜態工廠方法代替構造函數」如何使用「靜態工廠方法」而不是構造函數?
如果你有
class A {
public static A getInstance() {
return new A();
}
}
是否有意義提供A類此方法,而不是調用new A()在代碼中。
查看here您可能想要這樣做的主要原因的一個很好的闡述。總結:
另一個讓我們想到的原因是文章沒有提到:可以實現有趣的邏輯以避免始終創建新對象(基於參數的緩存,回收等)。
對於上面的示例,提供靜態構造函數沒有多大意義。通常當你提供一個靜態構造函數時,你應該使普通構造函數保持私有。否則,仍然可以使用正常的構造函數創建實例。
我試着在這裏用另一個例子來解釋,當你可以使用靜態工廠方法。其中一個好處是,你可以給工廠方法可以理解的名字。
class Complex {
public static Complex fromCartesian(double real, double imag) {
return new Complex(real, imag);
}
public static Complex fromPolar(double modulus, double angle) {
return new Complex(modulus * cos(angle), modulus * sin(angle));
}
private Complex(double a, double b) {
//...
}
}
Complex c = Complex.fromPolar(1, pi)
或者另一個例子是Singleton模式。你不能只提供一個實例。因此,這就是爲什麼您將構造函數設置爲private並創建自己的getInstance方法的原因,因爲您確定總是隻有一個實例可用。
public class Singleton {
private volatile static Singleton singleton;
private Singleton() {
}
// synchronized keyword has been removed from here
public static Singleton getSingleton() {
if(singleton==null) {
synchronized(Singleton.class){
if(singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
與靜態方法調用的Singleton模式是一個更好的設計,如果烏拉圭回合尋找單個實例..因爲折返鎖定的靜態特性..的提供線程安全,也避免OUT- ...
可能的重複:http://stackoverflow.com/questions/929021/what-are-static-factory-methods-in-java – oksayt 2010-10-27 03:39:11
+1閱讀有效的Java – flash 2010-10-27 06:08:25