在Java中,建構函式的訪問級別通常是public, 它提供了一個構造該類物件的介面。可是你知不知道,把建構函式的級別設為private, 有一些特別用處。
先來看一段程式碼:
//Shape。java
public class Shape {
private Shape() {
/* set something here */
}
public static Shape makeShape(/* arglist */) {
System。
out。println("here is the shape you ordered");
return (new Shape());
public static void main(String args[]) {
Shape。
makeShape();
首先從語言角度分析,我們可以知道, 任何類的使用者都無法使用建構函式來生成一個圖形, 因為建構函式是私有的,無法被類以外的函式使用。而只能透過呼叫makeShape來實現。
也許你會問,為什麼不直接使用建構函式來生成圖形,而需要使用一個看上去多餘的makeShape方法呢?
這樣做有以下幾個好處:
1。
你可以返回任何的Shape型別,包括Shape的子類。比如你可以把makeShape寫成這樣:
System。out。println("here is the shape you ordered");
if (retangle)
return (new Retangle(/* arglist*/));
if (Circle)
return (new Circle(/* arglist */));
/* you can return as many shapes as you like */
這裡假設Retangle 和 Circle 都是shape的子類,並且和Shape類在同一個包?,Shape類可以訪問子類的建構函式。
這樣shape就提供了一個圖形工廠。 使用者透過一個介面就可以生成不同的圖形。事實上,這種用法被稱為“工廠模式”。
2。可以實現一個類只有一個物件。請看下面的程式碼
//Handler。
java
public class Handler {
private Handler handler = null;
private Handler() {
public static getHandler(/* arglist */) {
if (!handler)
handler = new Handler();
}。
在Java中,建構函式的訪問級別通常是public, 它提供了一個構造該類物件的介面。可是你知不知道,把建構函式的級別設為private, 有一些特別用處。
先來看一段程式碼:
//Shape。java
public class Shape {
private Shape() {
/* set something here */
}
public static Shape makeShape(/* arglist */) {
System。
out。println("here is the shape you ordered");
return (new Shape());
}
public static void main(String args[]) {
Shape。
makeShape();
}
}
首先從語言角度分析,我們可以知道, 任何類的使用者都無法使用建構函式來生成一個圖形, 因為建構函式是私有的,無法被類以外的函式使用。而只能透過呼叫makeShape來實現。
也許你會問,為什麼不直接使用建構函式來生成圖形,而需要使用一個看上去多餘的makeShape方法呢?
這樣做有以下幾個好處:
1。
你可以返回任何的Shape型別,包括Shape的子類。比如你可以把makeShape寫成這樣:
public static Shape makeShape(/* arglist */) {
System。out。println("here is the shape you ordered");
if (retangle)
return (new Retangle(/* arglist*/));
if (Circle)
return (new Circle(/* arglist */));
/* you can return as many shapes as you like */
}
這裡假設Retangle 和 Circle 都是shape的子類,並且和Shape類在同一個包?,Shape類可以訪問子類的建構函式。
這樣shape就提供了一個圖形工廠。 使用者透過一個介面就可以生成不同的圖形。事實上,這種用法被稱為“工廠模式”。
2。可以實現一個類只有一個物件。請看下面的程式碼
//Handler。
java
public class Handler {
private Handler handler = null;
private Handler() {
/* set something here */
}
public static getHandler(/* arglist */) {
if (!handler)
handler = new Handler();
}
}。