2014-10-01 102 views
3

我試圖創建一個具有使用靜態工廠方法的單屬性的類..實現辛格爾頓使用工廠方法

package ishan.Beans; 

public class ControlManager { 

    private static ControlManager controlManager=null; 

    private double id; 

    private ControlManager() 
    { 
     this.id=Math.random(); 
    } 

    public static ControlManager getControlManager() 
    { 

     if(null==controlManager) 
      return new ControlManager(); 

     return controlManager; 
    } 

    public double getId() { 
     return id; 
    } 

} 


package ishan.Beans; 

public class Usage { 

    public static void main(String a[]) 
    { 
     ControlManager cManager=ControlManager.getControlManager(); 

     ControlManager c=ControlManager.getControlManager(); 

     System.out.println(c); 
     System.out.println(cManager); 
    } 

} 

我每次運行此代碼,我得到ControlManager的不同實例C和cManager。我無法弄清楚問題或者我做錯了什麼。

+0

你在哪一行確切地分配給'controlManager'? – 2014-10-01 12:00:37

回答

1

你是不是節省掉在創建新實例...你的代碼是:

public static ControlManager getControlManager() 
{ 

    if(null==controlManager) 
     return new ControlManager(); 

,但應該是:

public static ControlManager getControlManager() { 

    if(controlManager == null) { 
     controlManager = new ControlManager(); 
     return controlManager; 
    } 
0

改變你getControlManager()

return new ControlManager(); 

controlManager = new ControlManager(); 

這是,它應該是什麼樣子到底:

public static ControlManager getControlManager() { 
    if(controlManager == null) { 
     controlManager = new ControlManager(); 
    } 

    return controlManager; 
} 


除了基於什麼意見,但公約備份IMO:
在編寫條件語句時(if)您的條件順序守ld堅持自然地說話的方式。例如:

  • 壞:if (null == contorlManager)
  • 好:if (controlManager == null)

原因或目標背後是,保持代碼的可讀性。沒有人問:「綠色的交通燈?」。

有關此的詳細信息,請參閱Yoda Conditions

+0

感謝您的答覆和公約thing.i'll記住:) – 2014-10-01 12:38:44

0

你的代碼應該變化:​

public static ControlManager getControlManager() { 
    if(controlManager == null)controlManager = new ControlManager();   
    return controlManager; 
} 

好運!