实现单身设计模式作为模板

这是一个问题:

实现一个单例设计模式作为模板,以便对于任何给定的类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

上一篇: implement a singleton design pattern as a template

下一篇: Synchronizing on library/third