码迷,mamicode.com
首页 > 其他好文 > 详细

滥用的单例模式

时间:2015-06-19 20:13:56      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:

项目中使用了不少单例模式,必须承认,当初使用时仅仅考虑到了单例模式使用时的便利性,当然也考虑了这些类没必要有多个实例,但是仍隐约感觉到可能存在问题,只不过现在没有发现,先转载两篇文章,mark下,等出现问题了再细细分析下:

http://topkung.blog.163.com/blog/static/105268043200923192912579/

http://www.nowamagic.net/program/program_DoNotAbuseSingleTon.php

总结下:

1. 隐式依赖引起的结构不清晰

C++头文件中不会看到B类对单例A类的依赖。

2. 单例类的扩展限制

  • 单例类的作用是单一的,即单例处理A类事务,就不能再用来处理B类事务,因为处理B类事务的结果会覆盖处理A类事务的结果,比如用来对鼠标左键计数的单例不能用来对鼠标右键再计数,否则会覆盖对鼠标左键的计数结果。
  • 继承单例类后,无法使用多态。因为只能通过GetInstance拿到该类的实例,拿不到子类的实例。

3. 程序结束时的内存泄漏

C++程序员门要考虑,java就不管了哈。单例模式delete释放内存的风险在于,你不知道delete后有没有再GetInstance,并且因为对象不是成员变量,所以你可能会忘记delete它。贴段代码mark下:

class CSingleton:
{
    // 其它成员
public:
    static CSingleton * GetInstance(){。。。}
private:
    CSingleton(){};
    static CSingleton * m_pInstance;
 
    class CGarbo // 它的唯一工作就是在析构函数中删除CSingleton的实例
    {
    public:
        ~CGarbo()
        {
            if (CSingleton::m_pInstance)
                delete CSingleton::m_pInstance;
        }
    };
 
    static CGarbo Garbo; // 定义一个静态成员,在程序结束时,系统会调用它的析构函数
}

程序在结束的时候,系统会自动析构所有的全局变量。事实上,系统也会析构所有的类的静态成员变量,就像这些静态成员也是全局变量一样。系统会调用CSingleton的静态成员Garbo的析构函数,该析构函数会删除单例的唯一实例。

 

滥用的单例模式

标签:

原文地址:http://www.cnblogs.com/android-devil/p/4589453.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!