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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘奇 初级黑马   /  2012-7-22 22:45  /  8990 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘奇 于 2012-7-23 15:00 编辑

一直很困惑单例模式的应用场合是怎么样的啊,开始学的时候这里就卡了半天才懂,但是感觉好像平时除了在面试题里会见到,也用不上单例啊,请教一下,单例要在什么场合用呢?用的多吗?

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
当需要对同一个资源进行利用时,就好比火车卖票,就那么一堆资源,需要多个线程进行处理,而单例就可以解决了,但是有安全问题注意奥!
class Single
{
         private static Single s=null;
         private Single(){}
         public static Single getInstance()
         {
                if(s==null)
               {
                    synchronized(Single.class)//注意这里的锁,因为是静态方法不能创建对象,只能有类对象了,记住奥
                  {
                      if(s==null)
                          s=new Single();
                     }
                 }
                return s;
        }
}

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
只需要使用一个单独的资源,并且需要共享这个单独资源的状态信息时,就能用到单例模式。
如果程序中重复的创建了同一个类的很多对象,通过应用单例模式则可以很好的避免创建通常的对象。这可以减少系统用来创建对象的时间,也可以节省垃圾收集器用来释放这些实例的时间
例如一个播放器程序,当用户打开一个播放音乐界面,再想打开另一个音乐播放时,之前的界面就关闭了。这就是一个单利模式的具体应用
其实单例模式通常和工厂模式一起使用

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
应用场合:
类中没有可以修改的成员变量(这个类没有状态),如果存在可以修改的成员变量会产生线程安全问题,除非加上synchronized 关键字,不建议使用,单例模式无法继承,所以无法扩展,无法更改它的实现。如果读取配置文件比较适合使用单例。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报

单例设计模式:
应用就是为了解决:一个类在内存中只能有一个对象。
比如多程序访问同一个配置文件,希望多程序操作的都是同一个配置文件中的数据,那么就需要保证该配置文件对象的唯一性。
上面图中有两种单例设计模式。
但是单例的延迟加载方式会出现多线程中的安全问题,需要对其进行修改(下图)


这样的话,就能保证单例的延迟加载模式(懒汉式)创建对象的唯一性
希望能帮你理解,最主要就是红色字体那部分话
回复 使用道具 举报
实际上操作系统的回收站就是一个单例设计模式,文件件选项勾上显示系统,会看到每个盘符下都有一个回收站,删除文件都会到同一个回收站中,这就是个单例模式。。
回复 使用道具 举报
你希望程序使用者不能随意自己创建对象,只能获取一个单独的对象,即只有一个实例存在。可以通过私有化构造函数,再对外提供一个获取这个对象的函数解决。有的时候需要一个全局对象,比如多线程卖票,多少窗口卖,也只是那么多票。又比如系统日志,多线程访问一个程序,需要记录日志,你不希望到时候看到N多个日志文件实例吧?就把日志单例化。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马