2010-12-08 93 views
3

按照設計,在Singleton模式中,構造函數應該被標記爲private,並提供一個創建方法,以重新調用相同類型實例的私有靜態成員。我只創建了這樣的單例類。我應該爲我的單例類創建受保護的構造函數嗎?

public class SingletonPattern {// singleton class 

    private static SingletonPattern pattern = new SingletonPattern(); 

    private SingletonPattern() { 

    } 

    public static SingletonPattern getInstance() { 
     return pattern; 
    } 

} 

現在,我必須擴展一個單例類來添加新的行爲。但是私有構造函數不會讓定義子類。我正在考慮將默認構造函數更改爲單例基類的受保護構造函數。

如果我將構造函數定義爲protected,會出現什麼問題?

尋找專家的意見....

回答

6

如果擴展通過繼承一個單獨的類,你必須四處奔波應該有人搶你的單身主義者和原單的單例類的兩個實例。

如果最初的單身人士在概念上真的應該是單身人士,那麼使用構圖可能是一種方式。然而,那麼可替代性就會丟失(你的類不能替代原來的單例;它只是使用它)。

你有具體的例子嗎?

1

如果你這樣做,它不是一個單身人士。但也許你並不需要一個單身人士。

0

這不是Singleton類。想象一下,我可以調用getInstance()靜態方法n次,我可以有這個類的n個對象,因此完全違反了Singleton Pattern。爲了使它成爲Singleton,你應該檢查對象是否已經創建或者不在getInstance()方法中。如果已經創建,那麼你應該忽略,不要再創建。例如,你可以這樣類似的東西,請忽略語法錯誤,只需解釋一段代碼,就可以在不同的語言中有所不同。

public class SingletonPattern {// singleton class 

private static SingletonPattern pattern = new SingletonPattern(); 

private SingletonPattern() { 

} 

public static SingletonPattern getInstance() { 
    if(SingletonPattern == null) { 
     return new SingletonPattern(); 
    } 
} 
0

老問題我知道,但碰巧遇到這種情況,並認爲我可以添加一些有用的東西。

在單例類中可能有受保護的構造函數。如果你想在你的Singleton上有多態行爲,你可以將它設爲一個抽象類,將構造函數設置爲protected,並將實例的創建委託給其中一個具體的子類。

我發現書中下面的示例「設計模式解釋」:

abstract public class Tax{ 
    static private Tax instance; 

    protected Tax() {}; 

    abstract double calcTax(double qty, double price); 

    public static Tax getInstance() { 
     // code to determine what implementing class to use 
     instance = USTax.getInstance(); 
     return instance; 
    } 
} 

public class USTax extends Tax { 
    private static USTax instance; 
    private USTax() { 
    // instantation local members + Tax abstract class 
} 

public double calcTax (double qty, double price){ 
    // implementation 
} 

public static Tax getInstance() { 
    if(instance == null) 
     instance = new USTax(); 
    return instance; 
    } 
} 
相關問題