2009-09-24 3 views
0

나는 3 개의 인터페이스 클래스 IVideo , IAudio , IGPIO과이 인터페이스를 구현할 다른 세 클래스 인 Video_impl , Audio_impl , GPIO_impl을 가지고 있습니다.기본 클래스 인 ISingleton 인터페이스

지금까지는 간단합니다.

하지만 그 모든 객체는 싱글 톤이되어야합니다. 다음은 질문입니다. Video_impl , Audio_impl , GPIO_impl (또는 IVideo , IAudio , IGPIO?)이 그 인터페이스를 상속 할 수 있도록 ISingleton 인터페이스를 추상화하는 것이 좋은 생각입니까?

다음과 같이 구현할 생각입니다. 그것은 권위가 있습니까? 나는 더 좋은 방법이 있어야한다고 생각합니다.

//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; 
}; 
+0

C++ 및 C#과 비슷한 모양입니다 ... –

+0

감사합니다. Stefan.It이 C++입니다. – pierrotlefou

답변

3

Alexandrescu의 "Modern C++ Design"을 읽는 것이 좋습니다. 그 중에서 많은 다른 것들 중에서 그는 완벽한 싱글 톤 템플릿을 디자인하고, 파괴되어야 할 때, 파괴 된 후에 부활해야하는지, 다른 싱글 톤을 파괴하는 동안 필요하기 때문에 많은 문제를 생각합니다. 그리고 모든 좋은 것들.

+0

실제로 평생의 문제는 까다 롭고 과소 평가해서는 안됩니다. 저는 Phoenix 정책을 좋아합니다. :) –

1

여기에는 이점이 표시되지 않습니다. 파생 클래스에서 getInstance() 메서드를 구현해야합니다. 따라서 템플릿과 다중 상속을 도입했지만 실제로 얻은 것은 없습니다. 내가 볼 수있는 유일한 작은 이득은 당신이 모든 싱글 톤의 공유를 일반적인 방법으로 만들고 있다는 것입니다. 그러나 이것은 제가 그것이 진정한 이득이라고 생각하지 않는 일반적인 패턴입니다.

1

당신의 싱글 톤은 작동하지 않습니다. 가상 메서드를 사용하여 인스턴스를 반환 할 수는 없으므로이 인스턴스는 인스턴스로만 호출 할 수 있습니다. 적어도 정적 메소드 나 싱글 톤을 구현하는 중간 객체가 필요합니다.

이와 같이 일반화하려는 경우 C++에서 싱글 톤 구현을 읽어야합니다. 그러나 모든 도서관 코드에 대한 나의 충고는 당신이 먼저 필요로하는 깨끗하고 간단한 구현을 만드는 것이다. 싱글 톤의 경우 이것은 단순히 상속없는 정적 메서드로 구현됩니다. 그리고 당신이 그것을 여러 번 구현하고 추상적 인 구현을위한 모든 동기와 세부 사항을 충분히 이해한다면 그것을위한 라이브러리를 만들어야합니다. 라이브러리를 너무 일찍 생성하는 것은 버그와 유지 보수가 불가능한 코드의 가장 큰 원인 중 하나입니다.

관련 문제