抽象接口`ISingleton`是基类

时间:2009-09-24 09:22:31

标签: c++ design-patterns singleton multiple-inheritance

我有3个接口类IVideo , IAudio , IGPIO和其他三个将实现这些接口的类:Video_impl , Audio_impl , GPIO_impl

到目前为止事情很简单。

但是,我希望所有这些对象都是 singleton 。以下是问题:

抽象接口ISingleton是一个好主意,以便Video_impl , Audio_impl , GPIO_impl(或IVideo , IAudio , IGPIO?)可以继承它吗?

我正在考虑以下列方式实施它。推荐吗?我认为必须有更好的方法。

//Isingleton.hpp
template <class T>
class ISingleton
{
public:
virtual T *getInstance() = 0;

};

class IGPIO
{
public:
virtual int SelectAudioInput() = 0;
};

class GPIO_impl : public IGPIO, public ISingleton<IGPIO>
{
public:
    IGPIO *getInstance();
    int SelectAudioInput() ;
private:
    IGPIO *instance;
};

3 个答案:

答案 0 :(得分:3)

我建议阅读Alexandrescu的“现代C ++设计”。在其他许多事情中,他设计了一个完全成熟的单身人士模板,并思考许多问题,例如什么时候应该被摧毁,它是否应该在被摧毁后复活,因为在其他单身人士被摧毁时需要它,还有那些好东西。

答案 1 :(得分:1)

我没有看到这里的好处。您仍然必须在派生类中实现getInstance()方法。所以你已经引入了模板和多重继承,但还没有真正获得任何东西。我能看到的唯一一个微小的好处就是你将所有单身人士的共享作为一种常见的方法,但这是一种常见的模式,我认为这不是真正的收获。

答案 2 :(得分:1)

你的单身人士不会工作。您不能使用虚方法返回实例,因为只能使用实例调用它。您至少需要一个静态方法,或实现单例的中间对象。

如果你打算像这样概括它,你应该阅读C ++中单例的实现。但是我对所有库代码的建议是首先创建您需要的简洁实现。在单例情况下,这将简单地将其实现为没有继承的静态方法。然后,只有当您多次实现它并完全理解抽象实现的所有动机和细节时,才应该为它创建一个库。过早创建库是导致错误和无法维护的代码的最大原因之一。