【问题标题】:making a SingletonMixin class in c++在 C++ 中创建一个 SingletonMixin 类
【发布时间】:2010-08-15 14:51:39
【问题描述】:

我有四个班级,我们称之为 S1、S2、S3 和 S4。这些类是单例;每个都有一个 getInstance 和一个 finalize 方法 - 以及一个实例私有变量。

现在,为了避免重复 finalize 和 getInstance 方法,我正在尝试创建一个 SingletonMixin 类,例如:

template<class T> class SingletonMixin
{
    public:
        static T* getInstance();
    private:
        static T* instance;

};

这里的问题是:如何实例化单例类并保持其构造函数私有?


编辑

(澄清)

我的意思是,我该怎么做:

template<class T> T* SingletonMixin<T>::instance = 0;
template<class T> T* SingletonMixin<T>::getInstance()
{
    if (instance == 0)
    {
        instance = T();
    }
    return instance;
};

但使用私有 T 构造 T()


谢谢!

【问题讨论】:

  • 简单的答案是:不要。单例是一种可怕的设计模式,应尽可能避免。
  • 四个单例类?大多数人都想不出一个适当地使用单例。
  • @jalf: 只是一个练习,我正在学习语言。
  • @jalf:几年前我确实找到了一个用途。可以想象,在我退休之前,我会找到单身人士的另一种用途。

标签: c++ design-patterns singleton mixins


【解决方案1】:

问题:如果您将(反)构造函数设为私有,则 Singleton 基类无法生成实例。

但是:

friend class SingletonMixin<Foo>;

是你的朋友。

【讨论】:

  • 没有解构函数,只有析构函数。
【解决方案2】:

以下方法不起作用吗?

class Foo : public SingletonMixin<Foo>
{
};

【讨论】:

  • 不行,基类不能调用派生类的构造函数/析构函数,如果它们是受保护的/私有的。您已将基类声明为 friend 以便能够做到这一点。
【解决方案3】:

单例和继承非常糟糕地混合在一起。这是因为关于 Singleton 的基本陈述是:“这个类只能有一个实例”,而子类的存在意味着至少存在不同实例的可能性。您几乎可以肯定地重构它以使这四个类不是单例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    相关资源
    最近更新 更多