`
chriszeng87
  • 浏览: 717317 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用单例模式需要注意的几个问题

阅读更多

转自:http://www.nowamagic.net/librarys/veda/detail/1776

 

单例模式是最简单的设计模式之一,但是它却存在一些问题与缺陷。下面简单说下单例模式的使用中需要注意的一些问题。

1. 实例指针一定要设为静态吗?

因为GetInstance这个方法要用到该实例指针,且GetInstance这个方法是static的,所以这个指针必须是static的,否则GetInstance无法访问该实例指针。以此同时保证了向其他对象提供唯一的同一个内存区的实例指针。

2. 为什么不弃用懒汉式而直接用饿汉式?

首先,懒汉式是典型的以时间换取空间的例子,就是每次获取实例时都要进行判断,看是否要创建实例,浪费判断时间。当然如果一直没有人用的话,就不会创建实例,则是节约空间。而饿汉式是典型的以空间换取时间,就是说当类装载的时候,就创建出一个实例,不管你用不用它,然后每次调用时就不用判断了,节省了运行时间。

这里说某种方式一定比另一种方式好,它们两者各有各的优势。关键取决于你在时间和空间上效率的取舍。

3. 单例模式只是为了节省资源吗?

首先要说明的是,在一些情况下使用单例模式是可以达到节省资源的目的,但是单例模式的意图不只是为了节省资源,如果仅仅为了节省资源就使用单例模式的话可能造成单例模式的滥用。单例模式是为了确保在整个应用期间只有一个实例,以达到用户的特定的使用目的。比如windows操作系统里,有多个线程要同时进行文件创建、打开、修改一个文件的操作时,就用到单例模式设计文件管理器。所有的文件操作都必须同个这个唯一的实例来进行文件操作,避免的混乱的情况。

4. 单例模式的坏处?

  • 扩展困难,由于GetInstance静态函数没有办法生成子类的实例。如果要拓展,只有重写那个类。
  • 隐式使用引起类结构不清晰。比如有时候,你并不知道某个类A是单例类,当你读类B的时候,你可能先看它头文件,或者类视图里的内容,从这里你无法知道A和B 关系,因为B类在实现的时候才使用A类的那个所谓的GetInstance函数,读不到这行,你就会知道B类对A类的依赖关系。
  • 导致程序内存泄露的问题。很多人只是调用了GetInstance生成唯一的实例,却永远new被封装在GetInstance里忘了去释放内存。

5. 什么情况下不能用单例模式?

单例模式简单易用,但是也是所有设计模式中最容易滥用的模式。当你的类想得到很好的扩展时,不能使用单例模式。 

也许你的程序一开始并非一定要确保只有一个实例,如果你仅仅是为了节省资源而用的话,这个时候要慎用,因为随着时间的推延也许你的程序还需要扩展。

分享到:
评论

相关推荐

    Android开发中使用单例模式的一个小的注意点(在私有构造中做一些初始化的问题)

    说在最前面:本篇文章不是讲单例模式有哪几种创建方式以及各自的利弊,也不说什么情况下单例模式失效以及内存泄漏等类似面试题,只说个人在应用中想要总结的一个小问题,如果冲着上面说的内容来的,那可以继续找其他...

    Python单例模式实例详解

    主要介绍了Python单例模式,结合实例形式分析了单例模式的概念、实现与使用方法、已经相关注意事项,需要的朋友可以参考下

    JS的几种设计模式

    文章目录JS的几种简单设计模式一、单例模式单例模式介绍核心代码如下注意将代码进行优化单例模式的简单应用场景二、组合模式组合模式介绍实现思想组合模式代码组合模式的简单应用场景三、观察者模式观察者模式介绍...

    C#23种设计模式_示例源代码及PDF

    单例模式只应在有真正的“单一实例”的需求时才可使用。 结构型模式 6、ADAPTER —在朋友聚会上碰到了一个美女 Sarah,从香港来的,可我不会说粤语,她不 、 会说普通话,只好求助于我的朋友 kent 了,他作为我和 ...

    二十三种设计模式【PDF版】

    下去,浓淡几个叶子,待毛笔的水墨要干枯时,画一下树干,这样,一个活生写意的树就画出来. 我上面这些描述其实都是一种模式,创建模式的人是大师,但是拘泥于模式的人永远是工匠. 再回到传统建筑中,中国的传统建筑是过分...

    day020-继承加强和设计模式代码和笔记.rar

    以后配置文件都要放到项目中的一个或者几个单独的文件夹中,为了好管理。 该文件夹类型是source folder类型,源文件夹,eclipse工具会自动编译 --------------------------------------------------------------...

    《Android应用开发》个人总结报告.doc

    尽管例子之间的连接 比较零散,不过通过这些例子的学习我可以学习到了很多和以前java上相通的思想,因 为Android在现在也是全新的技术和框架,在其中我也学到了如何用单例模式、工厂模式 等常用的设计模式进行学习,...

    实战Java高并发程序设计(第2版)PPT模板.pptx

    1走入并行世界 1.1何去何从的并行计算 1.2你必须知道的几个概念 1.3并发级别 1.4有关并行的两个重要定律 1.5回到java:jmm 1.2你必须知道的几个概念 1.3并发级别 1.4有关并行的两个重要定律 1.5回到Java:JMM 实战...

    java6string源码-jBeanBox:jBeanBox是一个微型IOC/AOP工具(注意:问题请提交Gitee站点)

    非单例模式时性能差。 Guice: 源码臃肿(200多个类),手工绑定使用不方便,功能不全,如不支持PostConstruct、不支持类路径扫描。 Feather:源码极简(几百行),但功能不全,只是DI工具,不支持AOP。 Dagger: 源码略...

    超级有影响力霸气的Java面试题大全文档

    创建了几个String Object? 两个 31、EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?  SessionBean: Stateless Session Bean 的生命周期是由容器决定的,当客户机发出请求要建立一个...

    java 面试题 总结

    创建了几个String Object? 两个 28、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 public class ThreadTest1{ ...

    传智播客扫地僧视频讲义源码

    20_信息系统框架集成第三方产品案例_几个重要的面向对象思想_传智扫地僧 21_作业 文档和源码 01_上一次课程回顾 02_数组指针语法梳理 03_函数指针语法梳理_传智扫地僧 04_函数指针做函数参数思想剖析_传智扫地僧 05_...

    (java se 代码)Bank Account Management System 银行账户管理子系统

    提醒:一定要理解使用单例模式的原理。 ATM 4: 要求1:新增一个贷款功能 为了满足业务发展的需求,银行需要为用户提供贷款的功能,来满足更多的用户需求。 抽象出一个贷款功能的接口:Loanable 该接口具有以下功能...

    java面试题

    Struts1只是在第一次请求的时候创建一个action实例,以后每次相同的请求都直接从内存中去读取,它是单例模式,安全性较差。 Struts2是如何实现MVC模式的? 答:在Struts2里面是将每次页面的请求进行处理,然后将请求...

    AngularJS开发教程之控制器之间的通信方法分析

    service的方式(单例模式) 二、基于scope继承的方式: 最简单的让控制器之间进行通信的方法是通过scope的继承。假设有两个控制器Parent、Child,Child 在 Parent 内,那Child 可以称为控制器Parent的子控制器,它将...

    injector_io:InjectorIO-颤振的依赖注入

    InjectorIO-颤振的依赖注入 ... 每次使用get()时,您都会收到一个相同的实例。 factory() =>用于注册工厂实例。 每次使用get()时,您都会收到一个新实例。 注意:不要与get()和inject()混淆。 请记住以下几

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    (1)针对多窗口类浏览器模式问题,指出并分析了该问题存在的原因,利用Activity的运行机制,通过Fragment栈对主要模块的Webview进行管理,实现对不同模块之间切换的控制。 (2)针对跨域数据交互问题,指出并分析了...

    MorphologicalAdaptation:出于我的Msc论文文档的目的,存储有一个形态适应库的冻结克隆的存储库

    每个环境中都有一个Simulation Manager单例,它可以完全控制模拟的参数。 LevelManager脚本的扩展,它可以控制环境参数,课程学习和适应性功能。 一个Sun GameObject插件可以扩展每个环境的热量水平,如本文中所述...

    精通QTP——自动化测试技术领航

    1.3.2.1 录制相关功能只需把握几个重点 39 1.3.2.2 为什么说录制是学习利器,有根有据,请听我细细道来 52 1.3.3 录制时需注意模式的切换 54 1.3.3.1 3种录制模式的基本介绍 54 1.3.3.2 Analog Recording和Low ...

Global site tag (gtag.js) - Google Analytics