카테고리 없음
Singleton pattern
코드베어
2024. 2. 12. 13:14
싱글턴 패턴은 소프트웨어 디자인 패턴 중 하나로 프로그램 내에 인스턴스가 오직 하나만 존재하도록 보장하는 패턴이다. 이 패턴은 전역 변수를 사용하지 않고 객체의 단일 인스턴스에 대한 전역적인 접근을 제공한다.
- example
#ifndef _SINGLE_TON_TMPL_
#define _SINGLE_TON_TMPL_
#include <cstddef>
template <typename T>
class Singleton_tmpl : public T
{
public:
Singleton_tmpl() {}
~Singleton_tmpl() {}
static Singleton_tmpl *GetInstance()
{
if (Singleton_tmpl::m_pInstance == nullptr)
{
Singleton_tmpl::m_pInstance = new Singleton_tmpl;
}
m_nRefs++;
return m_pInstance;
}
void Release()
{
if (m_nRefs > 0)
{
m_nRefs--;
if ((m_nRefs == 0) && (m_pInstance))
{
delete m_pInstance;
m_pInstance = nullptr;
}
}
}
private:
static int m_nRefs;
static Singleton_tmpl *m_pInstance;
};
// init staic variables
template <typename T> Singleton_tmpl<T> *Singleton_tmpl<T>::m_pInstance = NULL;
template <typename T> int Singleton_tmpl<T>::m_nRefs = 0;
#endif
특정 클래스 T를 상속받는 클래스를 정의하였다. 클래스 내 정적멤버 변수 m_pInstance, m_nRefs를 선언하여 싱글톤 인스턴스를 관리하며 클래스 외부에서 정적 멤버 변수들을 초기화 하고 있다.
사용 예제이다.
Singleton_tmpl<CDerivedClass> *pDrCls;
pDrcls = Singleton_tmpl::GetInstance();
pDrcls->Functions();
if(pDrCls)
{
pDrCls->Release();
pDrcls = nullptr;
}
T타입으로 CDerivedClass를 사용하는 객체 변수를 선언하여 Getinstance()로 인스턴스를 할당 받는다. 처음 할당 받으면 인스턴스 생성과 동시에 m_nRefs값이 1이 되며 생성된 인스턴스가 반환될 것이고 이미 생성되어 있다면 m_nRefs 값이 1 증가하며 미리 생선된 인스턴스가 반환될 것이다.
사용이 완료된 pDrCls는 Release()를 호출하여 인스턴스 카운팅(m_nRefs)을 하나 줄이거나 인스턴스를(m_pInstance)를 해제 시킨다.