不是全球Singleton设计模式?

时间:2011-12-23 23:57:28

标签: c++ design-patterns singleton single-instance

  

可能重复:
  A Singleton that is not globally accessible

你知道一个好的设计模式,可以确保只创建一个对象实例,而不会在c ++中使这个对象全局化吗? 这就是单身人士所做的事情,但我真的需要它不是因为代码访问安全原因而全球化。

感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

我想你想要这样的东西(注意:从an answer I already wrote and forgot about复制粘贴):

#include <stdexcept>

// inherit from this class (privately) to ensure only
// a single instance of the derived class is created
template <typename D> // CRTP (to give each instantiation its own flag)
class single_instance
{
protected: // protected constructors to ensure this is used as a mixin
    single_instance()
    {
        if (mConstructed)
            throw std::runtime_error("already created");

        mConstructed = true;
    }

    ~single_instance()
    {
        mConstructed = false;
    }

private:
    // private and not defined in order to
    // force the derived class be noncopyable
    single_instance(const single_instance&);
    single_instance& operator=(const single_instance&);

    static bool mConstructed;
};

template <typename T>
bool single_instance<T>::mConstructed = false;

现在,如果类被构造多次,则会出现异常:

class my_class : private single_instance<my_class>
{
public:
    // usual interface (nonycopyable)
};

int main()
{
    my_class a; // okay
    my_class b; // exception
}

但是,无法在C ++的编译时强制执行单实例策略。


(同样擅长注意单身人士是愚蠢的。全球可接触和单一创造是两个不同的概念,只能巧合,而不是设计。)

答案 1 :(得分:1)

您可以使用具有典型静态Instance()访问函数的单例,但可以使用此函数private。然后,只允许访问另一个类,使其成为单例类的friend classes

答案 2 :(得分:0)

使构造函数和assignemnt运算符保持私有。

然后创建唯一一个将类的一个实例创建为该类朋友的函数 由于您正在编写函数,因此它是唯一可以创建对象的函数(并且应用程序中没有其他函数)。

答案 3 :(得分:0)

您可以使用命名空间和/或嵌套和本地类控制单例类/实例方法的可见性

单身教程 http://www.yolinux.com/TUTORIALS/C++Singleton.html

本地类示例 http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=191