2017-07-24 29 views
0

我從http://www.oracle.com/technetwork/articles/java/singleton-1577166.html這裏瞭解了Singleton模式,並且介紹了一些常見的實現錯誤。我只想檢查我寫的這些程序是否證明了他們的不正確。這是錯誤的單例模式實現的正確演示嗎?

在第一個程序中,我創建了一個繼承的類,並調用基類的受保護構造函數。這使我可以創建2個Singleton實例。

import java.util.*; 
import java.lang.*; 
import java.io.*; 

class Singleton { 
    public static Singleton Instance() { 
     if (_instance == null) { 
      _instance = new Singleton(); 
      return _instance; 
     } 
     return _instance; 
    } 
    protected Singleton() {} 
    private static Singleton _instance = null; 
} 

class SingletonBasher extends Singleton { 
    public SingletonBasher() { 

    } 
} 

class Ideone 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     Singleton x = new Singleton(); 
     Singleton y = SingletonBasher.Instance(); 
     if(x != y) 
      System.out.println("fail!"); 
    } 
} 

在第二個節目我只是創造了新的使用操作的兩個對象,這工作,因爲構造函數是受保護的。如果它是私人的,我會被迫使用實例方法,它只會允許我創建1個實例。

import java.util.*; 
import java.lang.*; 
import java.io.*; 

class Singleton { 
    public static Singleton Instance() { 
     if (_instance == null) { 
      _instance = new Singleton(); 
      return _instance; 
     } 
     return _instance; 
    } 
    private Singleton() {} 
    private static Singleton _instance = null; 
} 


class Ideone 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     Singleton x = Singleton.Instance(); 
     Singleton y = Singleton.Instance(); 
     if(x != y) 
      System.out.println("fail!"); 
    } 
} 
+0

您的'return _instance;'是多餘的,並以方法名稱中的小型大寫字母開頭:)。在某些情況下,您可能需要使用同步。 – Enzokie

+1

@Enzokie沒有'return'語句我得到一個編譯錯誤:http://ideone.com/MLXf3E –

+1

取消註釋其他返回語句不是那一個。 – Enzokie

回答

0

這個Singleton類適用於單線程程序。如果你想讓它在一個多線程程序中運行。你需要;

  1. 急切初始化_instance可變像下面

    私人靜態單_instance =新的Singleton();

  2. 同步訪問Instance()與雙重_instance == null檢查。

+0

是的,我閱讀了我已鏈接的文章中的正確實現在問題中。我只想知道我寫的兩個程序是否正確地證明了這個Singleton實現是不正確的?我試圖在每個程序中創建2個不同的實例,但它們真的不同嗎? –