黑马程序员技术交流社区

标题: 单例模式的应用场合 [打印本页]

作者: 刘奇    时间: 2012-7-22 22:45
标题: 单例模式的应用场合
本帖最后由 刘奇 于 2012-7-23 15:00 编辑

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

作者: 刘海源    时间: 2012-7-22 22:56
当需要对同一个资源进行利用时,就好比火车卖票,就那么一堆资源,需要多个线程进行处理,而单例就可以解决了,但是有安全问题注意奥!
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;
        }
}
作者: 李菁    时间: 2012-7-22 23:02
只需要使用一个单独的资源,并且需要共享这个单独资源的状态信息时,就能用到单例模式。
如果程序中重复的创建了同一个类的很多对象,通过应用单例模式则可以很好的避免创建通常的对象。这可以减少系统用来创建对象的时间,也可以节省垃圾收集器用来释放这些实例的时间
例如一个播放器程序,当用户打开一个播放音乐界面,再想打开另一个音乐播放时,之前的界面就关闭了。这就是一个单利模式的具体应用
其实单例模式通常和工厂模式一起使用
作者: 范泰洋    时间: 2012-7-23 00:05
应用场合:
类中没有可以修改的成员变量(这个类没有状态),如果存在可以修改的成员变量会产生线程安全问题,除非加上synchronized 关键字,不建议使用,单例模式无法继承,所以无法扩展,无法更改它的实现。如果读取配置文件比较适合使用单例。


作者: 曹俊    时间: 2012-7-23 02:02

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


这样的话,就能保证单例的延迟加载模式(懒汉式)创建对象的唯一性
希望能帮你理解,最主要就是红色字体那部分话

作者: 胡文凡    时间: 2012-7-23 02:59
实际上操作系统的回收站就是一个单例设计模式,文件件选项勾上显示系统,会看到每个盘符下都有一个回收站,删除文件都会到同一个回收站中,这就是个单例模式。。
作者: 党巾水    时间: 2012-7-23 10:23
你希望程序使用者不能随意自己创建对象,只能获取一个单独的对象,即只有一个实例存在。可以通过私有化构造函数,再对外提供一个获取这个对象的函数解决。有的时候需要一个全局对象,比如多线程卖票,多少窗口卖,也只是那么多票。又比如系统日志,多线程访问一个程序,需要记录日志,你不希望到时候看到N多个日志文件实例吧?就把日志单例化。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2