【发布时间】:2014-11-21 16:42:43
【问题描述】:
我希望类继承单例类。因此,我需要使构造函数受保护而不是私有。另外,我知道静态方法不能被覆盖,因为静态是类成员。现在,问题是如果我让构造函数受到保护,会有什么问题吗?单例场景中受保护的构造函数有缺点吗?我说的是C++的参考。
【问题讨论】:
-
主要缺点是你有一个单例。 stackoverflow.com/questions/137975/…
我希望类继承单例类。因此,我需要使构造函数受保护而不是私有。另外,我知道静态方法不能被覆盖,因为静态是类成员。现在,问题是如果我让构造函数受到保护,会有什么问题吗?单例场景中受保护的构造函数有缺点吗?我说的是C++的参考。
【问题讨论】:
我不认为让构造函数受保护有任何缺点。受保护的访问说明符旨在用于继承。
如果您不保护基类构造函数,您将如何创建派生类对象?
下面是一个简单的实现。
class Base {
public:
static Base* getInstance() {
if(Base::_instance == NULL)
Base::_instance = new Base();
return Base::_instance;
}
protected:
Base() {}
private:
static Base* _instance;
};
在 .cpp 文件中:
Base::_instance = NULL;
class Derived : public Base {
public:
static Derived* getInstance() {
if(instance == NULL)
_instance = new Derived;
return _instance;
}
private:
static Derived* _instance;
};
【讨论】:
getInstance() 都会创建一个新实例,让用户负责删除它。用户被告知它是一个单例,不会想删除它,所以它会被泄露。
简短回答:不要。 您可能有充分的理由使用单例(不太可能,但到底是什么)。 我几乎不认为你有充分的理由让一个单例派生自另一个单例。
这完全没用。当您创建Derived 的实例时,您将创建Base 的实例。
只需将Derived 设为单例,将Base 设为具有公共构造函数的标准类即可。
Singleton 设计模式是指创建类实例的接口。这仅意味着您将要实例化的具体类。不是潜在的抽象基类。
【讨论】:
我认为其他一些帖子误解了 OP 的意思,所以我只给我两分钱 :)。我认为 OP 正在谈论如下结构:
template<class A>
class Singleton // class that defines what is means to be Singleton
{
private:
protected:
Singleton() = default;
public:
static A& instance()
{
static A a;
return a;
}
};
class DerivedSingleton: public Singleton<DerivedSingleton> // Make concrete Singleton
{
friend Singleton<DerivedSingleton>;
private:
DerivedSingleton();
public:
void DerivedMethod();
};
// .. some code ...
DerivedSingleton::instance().DerivedMethod(); // call method
在这种情况下,我没有看到任何问题与创建 Singleton 构造函数 protected。获取DerivedSingleton 的唯一方法是通过Singleton 类的instance 函数。 Singleton 是否是一个好的设计模式我没有意见。
【讨论】: