`
chriszeng87
  • 浏览: 741222 次
  • 性别: 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. 什么情况下不能用单例模式?

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

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

分享到:
评论

相关推荐

    设计模式——单例模式

    为了解决懒汉式单例模式的性能问题,有几种优化策略: 1. **双检锁/双重校验锁(DCL,即 double-checked locking)** ```java public class Singleton { private volatile static Singleton instance; private ...

    为什么要使用PHP单例模式及应用实例.docx

    为了正确地实现单例模式,需要注意以下几点: 1. **私有静态实例变量**:通常需要一个私有的静态变量来保存单例的实例。 ```php private static $_instance = null; ``` 2. **私有构造函数和克隆函数**:为了...

    7种单例模式

    单例模式是软件设计模式中的一种经典模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如控制共享资源、管理配置对象等。下面将详细介绍七种常见的单例模式实现...

    单例模式,single

    单例模式虽然简单,但在实际应用中需要注意许多细节以确保其正确性和效率。特别是在现代软件开发中,考虑到多线程环境、类加载机制以及序列化等因素的影响,合理地设计和实现单例模式变得尤为重要。通过上述讨论,...

    单例模式详解

    在实现单例模式时,通常需要遵循以下几个原则: 1. **私有化构造函数**:防止其他类实例化该单例类。 2. **静态成员变量存储实例**:通过静态成员变量来保存类的唯一实例。 3. **提供静态公共方法获取实例**:通过...

    单例模式代码.rar

    同时,需要注意的是,单例模式虽然方便,但过度使用可能会导致代码耦合度增加,不利于测试和扩展。因此,应谨慎使用单例模式,并结合其他设计模式,如工厂模式、依赖注入等,以提高代码的可读性和可维护性。 在...

    JAVA单例模式的几种实现方法

    ### JAVA单例模式的几种实现方法 #### 一、饿汉式单例类 饿汉式单例类是在类初始化时就已经完成了实例化的操作。这种实现方式简单且线程安全,因为实例化过程是在编译期间完成的,不会受到多线程的影响。 **代码...

    设计模式-单例模式

    **设计模式——单例模式** 单例模式是一种广泛应用于软件设计中的创建型设计模式...总的来说,单例模式的应用旨在提高代码的可维护性和资源利用率,但也要注意避免滥用,以免造成设计复杂度增加和代码难以测试的问题。

    单例模式单例模式单例模式

    ### 单例模式详解 #### 一、单例模式的概念 单例模式是软件开发中最基本的设计模式之一,尤其在Java编程中应用广泛。...然而,也需要注意到单例模式的局限性和潜在的问题,在适当的情况下选择使用。

    大话设计模式--Singleton(单例模式)

    单例模式是软件设计模式中的一种经典模式,它在许多场景下被广泛使用,尤其是在需要全局唯一实例的情况下。本文将深入探讨单例模式的概念、作用、实现方式以及其在实际编程中的应用。 单例模式的核心思想是确保一个...

    关于单例模式的知识要点

    单例模式是软件设计模式中的一种,其主要目的是控制类的实例化过程,确保一个类在整个应用程序中只有一个实例存在。这种模式在很多场景下都非常有用,例如管理共享资源、配置对象或者全局日志服务等。下面我们将深入...

    Java单例模式深入理解

    在使用单例模式时,还需要注意以下几点: - 单例模式可能导致程序设计过度集中,不利于模块化。 - 序列化时需谨慎处理,否则可能会生成多个实例。 - 避免在静态域中引用其他单例对象,否则可能导致循环引用和内存...

    线程安全的单例模式

    单例模式在很多场景下都非常有用,例如系统配置管理、日志记录等场合,这些情况下往往只需要一个共享访问点或者控制所有实例的唯一行为。 #### 二、非线程安全的单例实现方式 在单例模式的实现中,通常有两种基本的...

    PHP 单例模式解析和实战

    **PHP 单例模式解析与实战** 在 PHP 开发中,单例模式是一种常见的...然而,使用时也需要注意其潜在的问题,合理权衡是否适用于特定场景。通过理解和实践,我们可以更好地掌握这一模式,并在实际项目中发挥其优势。

    java-单例模式几种写法

    单例模式是软件设计模式中的一种,用于控制类的实例化过程,确保一个类只有一个实例,并提供全局访问点。...同时,需要注意的是,单例模式虽然常用,但在某些情况下可能不适合,如当需要多个实例或者类需要被继承时。

    设计模式-单例模式(讲解及其实现代码)

    需要注意的是,单例模式可能会导致程序设计过于紧密耦合,不易于测试和扩展。因此,在使用单例时需谨慎,避免滥用。此外,如果需要依赖注入,可以考虑使用`Dependency Injection`框架来代替硬编码的单例。

    IOS单例模式Demo

    然而,单例也有一些潜在问题需要注意: - **测试困难**:由于单例的全局访问性,单元测试时很难替换或模拟,可能会导致测试不充分。 - **过度使用**:滥用单例可能导致不必要的耦合,影响代码的可读性和可维护性。 -...

    设计模式之单例模式

    单例模式是软件设计模式中的一种经典模式,它在许多实际场景中被广泛使用,尤其在需要控制类的实例只有一个的情况下。单例模式确保无论在程序的任何地方,只要通过特定方式请求创建该类的对象,始终只会返回同一个...

    单例模式分享-吴昌良

    注意几个关键点: - `__construct`方法是私有的,阻止了外部直接通过`new`创建实例。 - `__clone`方法也是私有的,防止通过克隆的方式创建新实例。 - `getInstance`是一个静态方法,用于返回单例类的唯一实例。 - `...

    ios单例模式demo

    在iOS开发中,单例模式常被用于以下几个方面: - `NSFileManager`:访问文件系统。 - `NSUserDefaults`:管理应用程序的用户默认设置。 - `UIApplication`:获取应用程序的信息和状态。 - `NSManagedObjectContext`...

Global site tag (gtag.js) - Google Analytics