单例模式

Service Locator

这实际上是属于一种全局获取依赖对象的设计模式,可以理解为“我不通过构造函数传进来,而是到一个全局注册中心里去拿对象。”

Meyer’s Singleton

经典代码(C++11 起,函数局部 static 的首次初始化具有线程安全保证,但不代表对象后续的所有操作都线程安全):

class StreamManager {
public:
    StreamManager(const StreamManager&) = delete;
    StreamManager& operator=(const StreamManager&) = delete;

    static StreamManager& instance()
    {
        static StreamManager obj;
        return obj;
    }

private:
    StreamManager() {}
};
//使用
StreamManager& manager = StreamManager::instance();

缺点

隐式依赖

RecordController(controller)
//它内部还依赖:
CmsStreamManager::instance()

生命周期不可控

谁创建? 谁销毁? 什么时候初始化?全隐藏。

多线程 shutdown 麻烦