设计模式---单例模式

来源:互联网 发布:进驻淘宝商城的条件 编辑:程序博客网 时间:2024/06/02 04:19

        单例模式是比较重要的一种模式,其主要作用是系统中仅存在一个类的唯一实例。维基百科上面的说明比较不错:

       單例模式,也叫單子模式,是一種常用的軟體設計模式。在應用這個模式時,單例對象的必須保證只有一個實例存在。許多時候整個系統只需要擁有一個的全局對象,這樣有利於我們協調系統整體的行為。比如在某個伺服器程序中,該伺服器的配置信息存放在一個文件中,這些配置數據由一個單例對象統一讀取,然後服務進程中的其他對象再通過這個單例對象獲取這些配置信息。這種方式簡化了在複雜環境下的配置管理。

         还有一点也需要使用单例模式,就是针对系统比较重要的资源,比如数据库连接,网络IO连接等等。

         原理:使用私有的构造函数,在该类的接口中构造一个对象。其他程序使用时,通过接口调用来获取单一类的实例即可。以下是实现方式:

1 基本实现:该实现在单线程环境中是可以使用的,但是到了多线程环境,其实很难保证该实例的单一。

          

package com.dev.design.singleton;public class Service {private Service(){}private static Service service = null;public static Service getServiceInstance(){return service == null?new Service():service;}}
         2 多线程环境实现:使用这种方式,在多线程环境中也可以保证实例的单一,但是只要使用这种方式,就会有同步,这样的话,在性能方面会有优化空间。

package com.dev.design.singleton;public class Service2 {private Service2(){}private static Service2 service = null;public static Service2 getServiceInstance(){synchronized(service){return service == null ? new Service2():service;}}}
         3 Double-Checked Locking :双重检查机制,这种实现方式就是目前最普遍的实现方式了。

package com.dev.design.singleton;public class Service3 {private Service3(){}private static Service3 service = null;public static Service3 getServiceInstance(){if(service == null){synchronized(service){if(service == null){service = new Service3();}}}return service;}}

         目前先记录到这里,单例模式很值得研究,基本上每个系统都会使用到单例模式,还有该模式的性能研究,使用的研究等。

         说一下,为什么是需要静态变量来持有单例呢?

         我的理解:如果使用非静态的变量来持有,这样的话,很可能会被java语言的垃圾收集器收集了,等到下一次使用的时候,又要重新构造了。这样性能消耗太大,我想正是因为这个原因,才会考虑使用静态变量了。