用Java创建Singleton对象

时间:2016-05-01 11:54:03

标签: java singleton

在我的Java程序中,我试图确保只创建“ATM”类的一个对象。为此,我有一个经典的单例类如下:

public class Singleton {

    private static Singleton uniqueInstance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }

}

如何确保只制作ATM类的一个对象?例如。我现在把代码放在哪里:

ATM theATM = new ATM();    

此代码是属于单例类还是属于ATM类?

1 个答案:

答案 0 :(得分:3)

您不需要Singleton课程,因为您的单身人士必须是ATM

所以,只需在ATM.java中使用它:

public class ATM {

    private static ATM uniqueInstance;

    private ATM() {}

    public static ATM getInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new ATM();
        }
        return uniqueInstance;
    }

}

现在,您可以拨打电话:

ATM theATM = new ATM();

只有当你在ATM类本身时,因为你的构造函数是private,但这是无用的,因为在这种情况下你关心uniqueInstance

如果你在不同的班级,你应该使用:

public class Main {

    public static void main(String[] args) {
        ATM theATM = ATM.getInstance();
    }

}

单例模式的想法是,即使再次运行ATM.getInstance();,也会返回相同的(初始)实例(uniqueInstance)。如果之前没有初始化,则初始化。否则,返回旧实例。因此,这就是您确定不会有多个实例的方式。

当然,单线程模式的更好实现是线程安全的。

E.g:

  • 线程安全 - 懒惰

    public class ATM {
        private static ATM uniqueInstance = null;
        private ATM(){}
        public static synchronized ATM getInstance() {
            if ( uniqueInstance == null ) {
                uniqueInstance = new ATM();
            }
            return uniqueInstance;
        }
    }
    
  • 线程安全 - 渴望

    public class ATM {
        private static ATM uniqueInstance = new ATM();
        private ATM(){}
        public static ATM getInstance() {
            return uniqueInstance;
        }
    }
    
  • 线程安全 - 使用枚举

    public enum ATM {
        UNIQUE_INSTANCE;
        ...
    }