Java 用工厂方法实现单例

Java 用工厂方法实现单例,java,singleton,Java,Singleton,我正在尝试使用静态工厂方法创建一个具有singleton属性的类 package ishan.Beans; public class ControlManager { private static ControlManager controlManager=null; private double id; private ControlManager() { this.id=Math.random(); } public

我正在尝试使用静态工厂方法创建一个具有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的不同实例。我无法找出问题所在,或者我做错了什么

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

但应该是:

public static ControlManager getControlManager() {

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

更改您的
getControlManager()

这就是它最终的样子:

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

    return controlManager;
}

除此之外,还有一些基于意见但得到国际海事组织公约支持的东西:
在编写条件语句(
如果
)时,条件的顺序应该遵循自然表达语句的方式。例如:

  • 错误:
    if(null==contorlManager)
  • 好:
    if(controlManager==null)
这背后的原因或目标是保持代码可读性。没有人问:“绿灯亮了吗?”


有关这方面的更多信息,请参见您的代码应更改为:​

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

祝你好运

您到底在哪一行分配给
controlManager
?感谢您的回答和约定。我会记住:)
controlManager = new ControlManager();
public static ControlManager getControlManager() {
    if(controlManager == null) {
        controlManager = new ControlManager();
    }

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