谈谈单例模式(三)

这次说的是单例模式的缺点,单例模式现在在很多开发中被人抛弃,究其原因其实很简单,就是缺点大于优点。
缺点:它是一个全局变量,只是被封装到了一个类中。由于其为全局变量,大家都可以访问到它,所以会引发以下问题。
问题一:理解代码更加困难。当出现bug时或者修改一些代码时,如果该代码中混进了单例,会使问题变得复杂,因为其是一个全局变量,我们不知道其在什么时候会被设置成一个错误值。这可能需要我们通过查看每个调用它的地方来查找原因。
问题二:促进了耦合的发生。在何时何地我们includ其头文件,便可以干一些事情,这看上去很方便,但是无形之中可能将不相关的两块代码进行了耦合。通过控制对实例的访问,可以控制一些不必要的耦合。
问题三:对并行不友好。当我们将某些东西转为全局变量时,我们创建了一块每个线程都能看到并访问的内存, 却不知道其他线程是否正在使用那块内存。 这种方式带来了死锁,竞争状态,以及其他很难解决的线程同步问题。这也是现在被抛弃的主因,因为硬件的原因,现在软件或者游戏都在追求多线程。

如果不用单例模式,那我们该怎么办。思考我们面对的问题(想要用单例模式解决的那个问题),寻找其他的思路。这个类真的需要存在吗?这个类真的需要唯一实例吗?这个类需要提供实例的公众全局访问吗?
有些单例类没必要存在的,比如一些管理类,可以试着让其管理的类自己管理自己。
如果我们仅仅需要一个唯一实例,可以这样来实现(基于C++):

class MySystem
{
public:
    MySystem()
    {
        //用断言来提醒那些想要创建的人这个类有些特殊
        assert(!_iscreated);
        _iscreated= true;
    }

    ~MySystem() { _iscreated= false; }

private:
    static bool _iscreated;
};

bool MySystem::_iscreated = false;

不提供实例的公众全局访问接口,那我们如何方便的使用它,1.传进来。2.可以放到基类中,从基类中获取。3.从已经是全局的东西中获取。视情况而定吧,我们需要什么,我们要避免什么。

单例模式有优点也有缺点,用与不用的关键是心中有没有数。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值