创建型模式3-单例模式

2018-04-16  本文已影响0人  sunblog

创建型模式3-单例模式

单例模式(singleton)

意图

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

问题思考

假如你是某移动设备系统的设计者,考虑向开发者开放电池的API。由于移动设备通常只有一个电源,保证开发者只能获取一个电源管理器(PowerManager)。普通的new显然不能满足我们的要求。

适用性

类图

singleton

实现


线程不安全版:
class Singleton {
public:
    Singleton *GetInstance() {
        if (!sInstance) {
            sInstance = new Singleton();
        }
        return sInstance;
    }
    
    void Operation1();
    
    void Operation2();
    
protected:
    Singleton() {...};

protected:
    static Singleton *sInstance = nullptr;
};



线程安全版:

#include<mutex>

class Singleton {
public:
    Singleton *GetInstance() {
        if (!sInstance) {
            {
                std::lock_guard<std::mutex> lk(sMutex);
                if (!sInstance) {
                    sInstance = new Singleton();
                }
            }
        }
        return sInstance;
    }
    
    // ...
    
protected:
    Singleton() {...};
    
protected:
    static Singleton *sInstance;
    static std::mutex sMutex;
};

Singleton *Singleton::sInstance = nullptr;
std::mutex Singleton::sMutex;

单例模式和子类的问题

但Singleton有子类(可能不止一个)的时候,创建一个唯一的子类实例并不简单,往往有可能创建多余的实例(其他子类的实例)。

一个参考的链接可以查看这两个StackOverflow页面12

上一篇 下一篇

猜你喜欢

热点阅读