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