使用工厂方法实现Singleton

时间:2014-10-01 11:59:43

标签: java singleton

我正在尝试使用静态工厂方法创建一个具有单例属性的类。

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);
    }

}

每次运行此代码时,我都会在c和cManager中获得不同的ControlManager实例。我无法弄清楚问题或我做错了什么。

3 个答案:

答案 0 :(得分:1)

您没有保存您创建的新实例...您的代码是:

public static ControlManager getControlManager()
{

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

但应该是:

public static ControlManager getControlManager() {

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

答案 1 :(得分:0)

更改您的getControlManager()

return new ControlManager();

controlManager = new ControlManager();

这就是它最终应该是什么样子:

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

    return controlManager;
}


此外还有一些基于意见的观点,但是以各种惯例为依据: 在编写条件语句(if)时,条件的顺序应该坚持自然地说出语句的方式。例如:

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

这背后的原因或目标是保持代码的可读性。没有人问:"交通灯是绿色的吗?"。

有关详细信息,请参阅Yoda Conditions

答案 2 :(得分:0)

您的代码应更改为:

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

祝你好运!!!