??? 類可以提供一個公有的靜態工廠方法,它用來返回這個類的實例,從而可以構造這個類的對象。
靜態工廠方法的好處:
-
它與構造函數不同,靜態工廠方法具有名字。這個好處可以幫助我們擺脫一個類只能有一個原型相同的構造函數的限制。舉個例子來說:
public class A
{
pubilc int sum=0;
public int div=0;
public A(int a,int b)
{
sum=a+b;
//
利用
a
和
b
在這里初始化
A
的實例
}
?
public A(int a,int b)????????? //
明顯的錯誤
{
div=a/b;
}
}
就像上面代碼所示,這么做是絕對不可能的,構造函數的簽名只在參數上進行區分,如果我們想用同一種參數實現不同的構造函數,那么構造函數的局限性就肯定了它是做不到的。但是我們可以利用靜態工廠方法來輕松解決這個問題:
public class A
{
public int sum=0;
public int div=0;
public static A Sum(int a,int b)
{
A a1=new A();
a1.sum=a+b;
return a1;
}
public static A Div(int a,int b)
{
A a1=new A();
a1.div=a/b;
return a1;
}
}
很明顯,我們可以用相同的參數來構造不同的對象了,如:
A a1=A.Sum(5,5);
A a2=A.Div(5,5);
我們做了什么一幕了然。當然這個例子可能有些不倫不類,但是在這里僅僅想說明這個問題,很極端但是很明確。
-
靜態工廠方法每次被調用的時候,不要求非得創建一個新的對象。有的時候我們僅僅需要這個類所表示某些項,但是不需要這個類的實例,那么靜態工廠方法可以很好的滿足這個要求。
-
靜態工廠方法可以返回一個原返回類型的子類型的對象。
靜態工廠方法的缺點:
-
類如果不含公有的或者受保護的構造函數,就不能被子類化。對于公有的靜態工廠所返回的非公有類,也是同樣的。如果一個類沒有共有的或者受保護的構造函數,那么這個類就不能被繼承。
-
靜態工廠方法與其他的靜態方法沒有任何區別。
在
API
文檔中,它們不會像構造函數那樣被明確標識出來。
posted on 2006-10-18 23:11
Jerry Cat 閱讀(1492)
評論(2) 編輯 收藏 引用