Singleton设计模式何时使用?

时间:2011-06-11 17:42:50

标签: java design-patterns

// Lazy Initialization 

Public MySingleton{
    private static mySingleton = null;

    Public Static getInstance(){
       if(null == mySingleton ){
            mySingleton = new MySingleton();
       }

       return mySingleton;
    }
}

// Eager Initilization 

Public MySingleton{
    private static mySingleton = new MySingleton();

    Public Static getInstance(){
        return mySingleton ;
    }
}

}

6 个答案:

答案 0 :(得分:2)

两者都不正确。您应该遵循Joshua Bloch的“Effective Java”中的示例集,基于枚举解释here

答案 1 :(得分:2)

随着java向依赖注入的方向发展,我已经看到越来越少的显式单例,如上所述。这是因为当IOC容器实例化一个对象时,它默认为单例。

答案 2 :(得分:2)

首先是尝试优化:

  • 如果您知道您的代码需要很长时间才能初始化,但很少使用,那么您应该使用lazy。
  • 如果您知道您的代码需要很长时间才能初始化,但是在程序运行一段时间后才使用,请使用lazy。
  • 如果在极少数情况下分析显示实际使用了单例,请使用lazy。

还有更多情况......这应该会给你一个开始。

答案 3 :(得分:0)

你的第一个例子根本不是单身人士。它会在每次调用时返回一个新实例!

那说,“更好”(懒惰与渴望)真的取决于你的情况。懒惰是更复杂的,这是它的主要责任。

答案 4 :(得分:0)

Use an enumeration.

   public enum Foo {
       INSTANCE;
   }  

Effective Java,

阅读
  

“这种方法在功能上   相当于公共领域   方法,除了它更多   简洁,提供序列化   机器免费,并提供   反对多重的铁定保证   实例化,即使面对   复杂的序列化或   反思攻击。虽然这个   方法尚未被广泛采用,   单元素枚举类型是最好的   实现单身人士的方法。“

答案 5 :(得分:0)

避免使用单例重复的最佳方法是执行以下操作:

public final MySingleton {

  //this will be instantiated at class loading time, thus insuring more than one thread
  //won't get separate instances.
  private static final MySingleton INSTANCE = new MySingleton();

  private MySingleton() {
    //empty for this example.
  }

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