Singletone이 뭔지 다들 한번씩은 들어 보셨을 꺼라고 생각 합니다.
VCL 객체중에 대표적인게 TApplication, TScreen 같은 객체들인데요
프로그램내에서 유일한 인스턴스를 가지고 어디서든 액세스 할수 있는 객체를 의미 합니다.
저 같은 경우에는 Singletone 객체를 전역 글로벌 객체나, 전역 글로벌 변수를 정의하고
프로그램 내부에서 액세스 하여 사용합니다.
주로 프로그램 전체 내에 유일한 환경설정값 같은 정보를 올려 놓습니다.
구현 소스는 다음과 같습니다.
class TSingletone
{
public :
inline static TSingletone* __fastcall CreateInstance ( void )
{
if ( This == NULL )
This = new TSingletone;
return This;
}
inline static void __fastcall ReleaseInstance ( void )
{
if ( This != NULL )
delete This;
}
private:
static TSingletone* This;
};
//---------------------------------------------------------------------------
TSingletone* TSingletone::This(NULL);
extern TSingletone *Singletone;
이런식으로 구현 되어 있고요
Singletone->CreateInstance(); // Singletone 생성.
Singletone->ReleaseInstance(); // Singletone 소멸.
이 소스 같은 경우에는 상속의 경우에 대한 대비가 되어 있지 않은 상태입니다.
그냥 싱글턴 개념 및 구현 부분만 있습니다.
실제 구현 소스
Unit_Logic.h
//---------------------------------------------------------------------------
#ifndef Unit_LogicH
#define Unit_LogicH
#include "frame_CreditReport.h"
#include "frame_DailyReport.h"
#include "frame_MemberView.h"
#include "frame_SaleGoods.h"
#include "frame_SaleReport.h"
//---------------------------------------------------------------------------
class TLogic
{
public :
static TLogic* __fastcall CreateInstance ( void )
{
if ( FThis == NULL )
FThis = new TLogic;
return FThis;
}
static void __fastcall ReleaseInstance ( void )
{
if ( FThis != NULL )
{
delete FThis;
FThis = NULL;
}
if ( FCreditReport != NULL )
{
delete FCreditReport;
FCreditReport = NULL;
}
if ( FDailyReport != NULL )
{
delete FDailyReport;
FDailyReport = NULL;
}
if ( FMemberReport != NULL )
{
delete FMemberReport;
FMemberReport = NULL;
}
if ( FSaleGoodsReport != NULL )
{
delete FSaleGoodsReport;
FSaleGoodsReport = NULL;
}
if ( FSaleReport != NULL )
{
delete FSaleReport;
FSaleReport = NULL;
}
}
__property TframeCredit* CreditReport = {read = FCreditReport, write = FCreditReport};
__property TframeDailyReport* DailyReport = {read = FDailyReport, write = FDailyReport};
__property TframeMemberView* MemberReport = {read = FMemberReport, write = FMemberReport};
__property TframeSaleGoods* SaleGoodsReport = {read = FSaleGoodsReport, write = FSaleGoodsReport};
__property TframeSale* SaleReport = {read = FSaleReport, write = FSaleReport};
private :
static TLogic* FThis;
static TframeCredit* FCreditReport;
static TframeDailyReport* FDailyReport;
static TframeMemberView* FMemberReport;
static TframeSaleGoods* FSaleGoodsReport;
static TframeSale* FSaleReport;
};
//---------------------------------------------------------------------------
/*
private static 변수는 이와 같은 방식으로 초기화 하여야 합니다.
*/
TLogic* TLogic::FThis = NULL;
TframeCredit* TLogic::FCreditReport = NULL;
TframeDailyReport* TLogic::FDailyReport = NULL;
TframeMemberView* TLogic::FMemberReport = NULL;
TframeSaleGoods* TLogic::FSaleGoodsReport = NULL;
TframeSale* TLogic::FSaleReport = NULL;
//---------------------------------------------------------------------------
extern TLogic* Logic;
//---------------------------------------------------------------------------
#endif
위의 실제 구현 소스는
메인폼에 인터페이스를 위한 6개의 프레임이 올라가는데,
이 프레임들을 관리 하기 위한 Singletone 객체 입니다.
Logic이라는 객체를 통해서 액세스 할수 있습니다.
실제 Logic 이라는 Singletone을 생성, 소멸 하는것은
이 프로젝트의 메인소스에서 생성, 소멸 시킵니다.
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->Title = "ezClickView";
Logic->CreateInstance();
Application->CreateForm(__classid(Tfrm_Main), &frm_Main);
Application->Run();
Logic->ReleaseInstance();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
이런식으로 생성, 소멸이 되고,
Logic->MemberReport
저는 이런식으로 사용합니다. ^^;
여기에 쓰인글이 싱글톤 패턴을 이용하는데 모든 경우를 설명한것은 아닙니다.
제가 이런식으로 이해하고 이런식으로 쓰고 있다는 예제에 불과 합니다.
더 좋은 방법을 찾아 보시길 바랍니다.
내용자체는 부실한 편입니다.
싱글톤의 개념과 원리만 설명한 부분이라서 그런것이니 양해 바랍니다.
예제소스 같이 올립니다.
예제 소스는 위에 올린 실제 적용 소스와 비슷한 내용의 소스입니다.
조금 더 바꾸면 프로그램 전체의 환경변수를 담아서 사용할수 있습니다.
참고 문서 :
http://www.obsof.com/delphi_tips/pattern.html#Singleton
Gof의 디자인 패턴
Gof의 디자인 패턴 이렇게 활용한다.
여기까지 보시느라 수고 하셨습니다.~
아무쪼록 도움이 되기를 바라면서 ~
즐프 하세요~
delete 후 This = NULL; 도 해주셔야 할듯.