A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄茂霖 中级黑马   /  2013-4-26 19:47  /  1232 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 shenqi 于 2013-4-27 00:07 编辑

第二贴之单例设计模式(Singleton)
        单例(Singleton)其实就是唯一实例的意思,也就是说一个类只有一个唯一的实例。在Java里,只要new一个类,就会创建这个类的一个实例,如果把这个类new多次,就会创建这个类的多次实例。有时候如果要程序运行时,不管new多少次,只需创建这个类的一个实例,这时候就用到单例。这就好比在足球场上,双方队员都在围绕着一个足球进行运动,时刻保持足球场上只有一个足球,试想一下如果足球场上有多个足球,球员岂不是乱套了不知该踢哪个球?
        单例是一种设计模式,是23种设计模式之一,也是当中最简单最重要的一个设计模式了。单例分为饿汉式(饱汉式)和懒汉式(饥汉式)。
        饿汉式(饱汉式):类加载时就创建好实例,等待别人调用。简单来说就是一开始就饿然后马上就吃饱了。张孝祥老师高新技术里称 饱汉式 和 饥汉式,这里区分一下就是。
示例代码:

  1. Class Singleton{
  2. //为了防止让别人创建多个实例,首先把修饰符的权限变成最小的
  3.         private Singleton (){}
  4.         //一上来就创建实例
  5. private static Singleton instance = new Singleton ();
  6.         //给外界提供一个唯一的实例的返回值
  7. public static Singleton getInstance (){
  8. return instance;
  9. }
  10. }
复制代码
懒汉式(饥汉式):类加载时不创建,等待别人调用时再创建实例。简单来说就是一开始不吃,等到饿的时候再吃。
示例代码:

  1.         Class Singleton{
  2.                 //同上
  3.                 private Singleton(){}
  4.         //一开始定义好
  5.         private Singleton instance = null;
  6.         //调用时再创建实例返回
  7.         public static Singleton getInstance(){
  8.                 if(instance == null)
  9.                         instance = new Singleton();
  10.                 return instance;
  11. }
  12. }
复制代码
注意:在多线程编程中 懒汉式 存在线程安全问题,会导致可能存在1个以上的实例,所以必须用双检测机制,把以上代码修改成:
Class Singleton{
         privateSingleton(){}
         privateSingleton instance = null;
        //在此处添加synchronized      

public static Singleton getInstance(){
if(instance == null){
    synchronized (Singleton.class){
    if(instance ==null){
           instance =new Singleton();
}
}
}
除此之外还可以使用JDK5.0的新特性枚举(enumeration)来设计单例模式:
示例代码:
  1. Class Singleton{
  2.          private Singleton(){}
  3.          private Singleton instance = null;
  4.         //在此处添加synchronized        
  5. public static Singleton getInstance(){
  6. if(instance == null){
  7.         synchronized (Singleton.class){
  8.         if(instance == null){
  9.                 instance = new Singleton();
  10. }
  11. }
  12. }
复制代码
关于枚举的知识,大家可以参考张孝祥老师的视频--高新技术①:
http://edu.csdn.net/news/2012823/6a28cc67ab0f.shtml

总结:
1.        在开发中通常使用的是饿汉式来设计单例模式,因为不存在线程安全问题。
2.        如果需要写多个单例,可以适当考虑使用enum枚举来设计,这样代码更加简洁。
3.        懒汉式 通常是面试官面试程序员用的,所以注意一下就可以。

评分

参与人数 1技术分 +1 收起 理由
HM汪磊 + 1

查看全部评分

2 个回复

倒序浏览
兄弟哪里人啊,一会饿一会饥的(修改下吧,按毕老师的叫法),我们老家才说饥的,
还有就是懒汉式的安全问题,双重判断,能稍微提高效率,代码也需要修改下
建议查一下单例在各方面的应用,搜一下,再总结,用自己的话串起来,开始的足球比喻就不错
这样会不会让你掌握更扎实呢,是的话继续加油!
回复 使用道具 举报
曹睿翔 发表于 2013-4-26 20:25
兄弟哪里人啊,一会饿一会饥的(修改下吧,按毕老师的叫法),我们老家才说饥的,
还有就是懒汉式的安全问 ...

张孝祥老师叫做饥汉,一开始我也蒙了 ,后来他解释才缓过来- -!~长下见解而已 嘻嘻!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马