[转]Singleton 模式

有这样一种类,它在整个系统中只存在一个实例.[中国这个类,地球这个类]

而保证这个类只有一个实例,是类设计者的责任,而不是类的使用者.

保证只有一个实例:

private constructor.

** 不要实现Cloneable和Serializable接口.

提供一个全局的访问点:

public static access method.

多线程安全?

如果Class的实例化的开销不大,可以在类加载的时候就实例化一次,且仅仅一次)

     1.Eager
  public class EagerInitialization {
     private static Resource resource = new Resource();
     public static Resource getResource() {
     return resource;
    }
     static class Resource {}
  }
  2.Lazy
  public class SafeLazyInitialization {
       private static Resource resource;
       public synchronized static Resource getInstance() {
          if (resource == null){
                resource = new Resource();

               }
         return resource;
      }
      static class Resource {}
  }
  3.double checked locking singleton ( 仅适用于java 5.0 以上版本)
  public class DoubleCheckedLockingSingleton {
          //java5.0 修改了内存模型, 可以保证使用volatile 声明的变量对于double checked locking是正确的
          private volatile static DoubleCheckedLockingSingleton uniqueInstance;
          private DoubleCheckedLockingSingleton() {}
          public static DoubleCheckedLockingSingleton getInstance() {
                    if (uniqueInstance == null) {
                          synchronized (DoubleCheckedLockingSingleton.class) {
                                     if (uniqueInstance == null) {

                                                   // temp = new DoubleCheckedLockingSingleton();
                                                   // uniqueInstance = temp; [通过这样会更安全,JVM的原子性保证]
                                              uniqueInstance = new DoubleCheckedLockingSingleton();
                                       }
                           }
                     }
                     return uniqueInstance;
            }
  }
  4.Lazy initialization holder class idiom
  public class ResourceFactory {
                //增加一个helper类来初始化对象
                 private static class ResourceHolder {
                            public static Resource resource = new Resource();
                  }
                 public static Resource getResource() {
                            return ResourceFactory.ResourceHolder.resource;
                 }
                 static class Resource {}
  }

      根据Classloader的原则,一个类在其信息被需要用到的时候才被JVM加载,resource只有在调用getResource的时候才初始化.

       Singleton 的扩展:

       Singleton 的核心是如何控制用户使用new对一个类的实例化.

        N个实例-->对象池.

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kkdelta/archive/2009/02/28/3945472.aspx

posted @ 2009-11-12 16:31  悦涵  阅读(193)  评论(0编辑  收藏  举报