Java中单例模式的多种实现方式

来源:互联网 发布:网络创业毕业论文 编辑:程序博客网 时间:2024/04/29 22:59

设计模式之单例模式:

单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。
特点:
       1,一个类只能有一个实例
       2,自己创建这个实例
       3,整个系统都要使用这个实例
    例: 在下面的对象图中,有一个"单例对象",而"客户甲"、"客户乙" 和"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。 


Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。一些资源治理器经常设计成单例模式。
    外部资源:譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干个通信端口,系统应当集中治理这些通信端口,以避免一个通信端口被两个请求同时调用。内部资源,譬如,大多数的软件都有一个(甚至多个)属性文件存放系统配置。这样的系统应当由一个对象来治理这些属性文件。一个例子:Windows 回收站。
在整个视窗系统中,回收站只能有一个实例,整个系统都使用这个惟一的实例,而且回收站自行提供自己的实例。因此,回收站是单例模式的应用。 两种形式:

package singleton;    /**  * @author lei  * 单例模式的五种写法:  * 1、懒汉  * 2、恶汉  * 3、静态内部类  * 4、枚举  * 5、双重校验锁  * 2011-9-6  */  /**  *五、 双重校验锁,在当前的内存模型中无效  */  class LockSingleton{      private volatile static LockSingleton singleton;      private LockSingleton(){}            //详见:http://www.ibm.com/developerworks/cn/java/j-dcl.html      public static LockSingleton getInstance(){          if(singleton==null){              synchronized(LockSingleton.class){                  if(singleton==null){                      singleton=new LockSingleton();                  }              }          }          return singleton;      }        }  /**  * 四、枚举,《Effective Java》作者推荐使用的方法,优点:不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象  */  enum EnumSingleton{      INSTANCE;      public void doSomeThing(){      }  }  /**  * 三、静态内部类 优点:加载时不会初始化静态变量INSTANCE,因为没有主动使用,达到Lazy loading  */  class InternalSingleton{      private static class SingletonHolder{          private final static  InternalSingleton INSTANCE=new InternalSingleton();      }         private InternalSingleton(){}      public static InternalSingleton getInstance(){          return SingletonHolder.INSTANCE;      }  }  /**  * 二、恶汉,缺点:没有达到lazy loading的效果  */  class HungrySingleton{      private static HungrySingleton singleton=new HungrySingleton();      private HungrySingleton(){}      public static HungrySingleton getInstance(){          return singleton;      }  }  /**  * 一、懒汉,常用的写法  */  class LazySingleton{      private static LazySingleton singleton;      private LazySingleton(){      }      public static LazySingleton getInstance(){          if(singleton==null){              singleton=new LazySingleton();          }          return singleton;      }     } 


0 0