Java 单例模式:使用枚举版本

Java 单例模式:使用枚举版本,java,design-patterns,enums,singleton,Java,Design Patterns,Enums,Singleton,我不知道如何实现Enum版本的Singleton模式。下面是一个使用Singleton模式实现“传统”方法的示例。我想将其更改为使用枚举版本,但我不确定如何更改 public class WirelessSensorFactory implements ISensorFactory{ private static WirelessSensorFactory wirelessSensorFactory; //Private Const private WirelessS

我不知道如何实现
Enum
版本的
Singleton
模式。下面是一个使用Singleton模式实现“传统”方法的示例。我想将其更改为使用枚举版本,但我不确定如何更改

public class WirelessSensorFactory implements ISensorFactory{

    private static WirelessSensorFactory wirelessSensorFactory;

    //Private Const
    private WirelessSensorFactory(){
        System.out.println("WIRELESS SENSOR FACTORY");
    }

    public static WirelessSensorFactory getWirelessFactory(){

        if(wirelessSensorFactory==null){
            wirelessSensorFactory= new WirelessSensorFactory();
        }

        return wirelessSensorFactory;
    }

}
这是您的单例:只有一个实例的枚举

请注意,此单例是线程安全的,而您的单例不是:两个线程可能都会遇到竞争条件或可见性问题,并且都会创建自己的单例实例

这里解释如下: 因此,可以这样简单地完成:

public enum EasySingleton{
    INSTANCE;
}
使用抽象工厂设计模式:

public class Singleton{
    //initailzed during class loading
    private static final Singleton INSTANCE = new Singleton();

    //to prevent creating another instance of Singleton
    private Singleton(){}

    public static Singleton getSingleton(){
        return INSTANCE;
    }
}

有效Java章节的在线参考

用法:

WirelessSensorFactory.INSTANCE.<any public method>
WirelessSensorFactory.INSTANCE。

标准模式是让您的enum实现一个接口-这样您就不需要在幕后公开比必须公开更多的功能

// Define what the singleton must do.
public interface MySingleton {

    public void doSomething();
}

private enum Singleton implements MySingleton {

    /**
     * The one and only instance of the singleton.
     *
     * By definition as an enum there MUST be only one of these and it is inherently thread-safe.
     */
    INSTANCE {

                @Override
                public void doSomething() {
                    // What it does.
                }

            };
}

public static MySingleton getInstance() {
    return Singleton.INSTANCE;
}

它比所有其他单例创建版本容易得多:-

public enum WirelessSensorFactory {

        INSTANCE;

        //private static WirelessSensorFactory wirelessSensorFactory;

        //Private Const
        //private WirelessSensorFactory(){

            //System.out.println("WIRELESS SENSOR FACTORY");

       // }


      //  public static WirelessSensorFactory getWirelessFactory(){

            //if(wirelessSensorFactory==null){

               // wirelessSensorFactory= new WirelessSensorFactory();
           // }

           // return wirelessSensorFactory;
       // }

}

以下是singlton类的示例

public class SingletonClass {
    private static SingletonClass singletonInstance = null;

    private SingletonClass() {      
    }

    public static SingletonClass getSingletonInstance() {       
        if(singletonInstance == null) {
            synchronized (SingletonClass.class) {
                if(singletonInstance == null) {
                  singletonInstance = new SingletonClass();
                }
            }
        }
        return singletonInstance;
    }
}

此代码段也将在多线程环境中运行,因为它对类应用了锁。

您所说的“枚举版本”是什么意思?使用枚举实现单例模式的另一种形式,它是在java 1.5中引入的,现在我明白您的意思了。尝试以下链接:谢谢,那么我将如何在主方法中使用该类?与任何其他枚举一样:WirelessSensorFactory.INSTANCE.someMethod()是的,因此只能使用该类的一个实例,multiton是否以相同的方式实现?这也不允许多个对象进行反序列化和反射。谢谢,那么我将如何在主方法中使用此类?@RNI2013我包含了示例用法。这是错误的。按照代码的方式,它只在多线程单核CPU系统中工作。在多核系统中,这种方法是错误的。写入和读取之间没有“之前发生”链接。使SingleTonStance易失性以保证在之前发生是的…需要一个对象是易失性的,私有易失性静态SingletonClass SingleTonStance=null;如前所述,
volatile
是必需的。
public enum WirelessSensorFactory {

        INSTANCE;

        //private static WirelessSensorFactory wirelessSensorFactory;

        //Private Const
        //private WirelessSensorFactory(){

            //System.out.println("WIRELESS SENSOR FACTORY");

       // }


      //  public static WirelessSensorFactory getWirelessFactory(){

            //if(wirelessSensorFactory==null){

               // wirelessSensorFactory= new WirelessSensorFactory();
           // }

           // return wirelessSensorFactory;
       // }

}
public class SingletonClass {
    private static SingletonClass singletonInstance = null;

    private SingletonClass() {      
    }

    public static SingletonClass getSingletonInstance() {       
        if(singletonInstance == null) {
            synchronized (SingletonClass.class) {
                if(singletonInstance == null) {
                  singletonInstance = new SingletonClass();
                }
            }
        }
        return singletonInstance;
    }
}