Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1535
  • 博文数量: 1
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2016-03-15 16:37
文章分类
文章存档

2016年(1)

我的朋友
最近访客

分类: Java

2016-03-17 22:52:03

Java模式之单例模式:

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


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


  1. package singleton;  
  2.   
  3. /** 
  4.  * @author lei 
  5.  * 单例模式的五种写法: 
  6.  * 1、懒汉 
  7.  * 2、恶汉 
  8.  * 3、静态内部类 
  9.  * 4、枚举 
  10.  * 5、双重校验锁 
  11.  * 2011-9-6 
  12.  */  
  13. /** 
  14.  *五、 双重校验锁,在当前的内存模型中无效 
  15.  */  
  16. class LockSingleton{  
  17.     private volatile static LockSingleton singleton;  
  18.     private LockSingleton(){}  
  19.       
  20.     //详见:http://www.ibm.com/developerworks/cn/java/j-dcl.html  
  21.     public static LockSingleton getInstance(){  
  22.         if(singleton==null){  
  23.             synchronized(LockSingleton.class){  
  24.                 if(singleton==null){  
  25.                     singleton=new LockSingleton();  
  26.                 }  
  27.             }  
  28.         }  
  29.         return singleton;  
  30.     }  
  31.       
  32. }  
  33. /** 
  34.  * 四、枚举,《Effective Java》作者推荐使用的方法,优点:不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象 
  35.  */  
  36. enum EnumSingleton{  
  37.     INSTANCE;  
  38.     public void doSomeThing(){  
  39.     }  
  40. }  
  41. /** 
  42.  * 三、静态内部类 优点:加载时不会初始化静态变量INSTANCE,因为没有主动使用,达到Lazy loading 
  43.  */  
  44. class InternalSingleton{  
  45.     private static class SingletonHolder{  
  46.         private final static  InternalSingleton INSTANCE=new InternalSingleton();  
  47.     }     
  48.     private InternalSingleton(){}  
  49.     public static InternalSingleton getInstance(){  
  50.         return SingletonHolder.INSTANCE;  
  51.     }  
  52. }  
  53. /** 
  54.  * 二、恶汉,缺点:没有达到lazy loading的效果 
  55.  */  
  56. class HungrySingleton{  
  57.     private static HungrySingleton singleton=new HungrySingleton();  
  58.     private HungrySingleton(){}  
  59.     public static HungrySingleton getInstance(){  
  60.         return singleton;  
  61.     }  
  62. }  
  63. /** 
  64.  * 一、懒汉,常用的写法 
  65.  */  
  66. class LazySingleton{  
  67.     private static LazySingleton singleton;  
  68.     private LazySingleton(){  
  69.     }  
  70.     public static LazySingleton getInstance(){  
  71.         if(singleton==null){  
  72.             singleton=new LazySingleton();  
  73.         }  
  74.         return singleton;  
  75.     }     

阅读(178) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~