实现单身设计模式作为模板
这是一个问题:
实现一个单例设计模式作为模板,以便对于任何给定的类Foo,可以调用Singleton :: instance()并获取指向Foo类型单例实例的指针。 假设存在已获取()和释放()方法的类Lock。 你怎么能让你的实现线程安全和异常安全?
我的分析:
正如Joshua Bloch在“有效的java”中指出的那样,实现单例类的更好方法是枚举和公共静态工厂方法。 结合volatile和synchronized是我知道的使线程安全和延迟初始化的方式,如下所示
public class myS{
private static volatile final _ins = null;
private myS(){};
public static myS getIns(){
synchronized(){
if(_ins==null) _ins = new myS();
}
return _ins;
}
}
在这一刻,我有点困惑,要做一个单身模板。 我的理解是我们要么有泛型类型的抽象类,要么有抽象类。 只要客户实施他们,他们就是单身人士。 所以,我的猜测解决方案如下:
public interface singleton<T>{
public T instance();
}
public class Foo implements singleton<T>{
private static volatile final Foo _ins = null;
public static Foo instance(){
synchronized(this)
if(_ins==null){
_ins = new Foo();
}
}
}
}
获得单例功能最简单的方法是使用像Spring这样的Dependancy Injection(DI)框架。 使用DI还有很多其他好处。
'单身'不适合'模板'。 这是一种矛盾。 如果认为你会更好地执行enums
如下
public enum MySingleton1 {
;
public static void MethodA() { ... };
}
public enum MySingleton2 {
;
public static int MethodB() { ... };
}
编辑
没有枚举的解决方案是:
public interface singletonMarker{};
public final class MySingleton1() extends singletonMarker {
public static final MySingleton1 INSTANCE = new MySingleton1();
private MySingleton1() {};
public synchronized int mySyncMethod() { ... };
}
用法
MySingleton1.INSTANCE.mySyncMethod();
界面只是作为标记,但并不是真的有必要。
链接地址: http://www.djcxy.com/p/64253.html