C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 강좌/문서
C++Builder Programming Tutorial&Docments
[118] [만해] Singletone의 구현 및 활용
강재호.만해 [greenuri] 11541 읽음    2007-01-14 23:25
Singletone.zip 677.8KB 예제 소스입니다.
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의 디자인 패턴 이렇게 활용한다.

여기까지 보시느라 수고 하셨습니다.~

아무쪼록 도움이 되기를 바라면서 ~

즐프 하세요~
쥐르미온 [diekun]   2007-01-16 15:44 X
ReleaseInstance에서
delete 후 This = NULL; 도 해주셔야 할듯.
nicekr.황경록 [mpbox]   2007-01-19 18:16 X
#define Logic->MemberReport GMemberReport
nicekr.황경록 [mpbox]   2007-01-23 17:26 X
from gpg1

template<typename T>
class CSingletonA
{
private:
    static T* m_pSingleton;

public:
    CSingletonA()
    {
        assert(! m_pSingleton);
        int offset = (int)(T*)1 - (int)(CSingletonA<T>*)(T*)1;
        m_pSingleton = (T*)((int)this + offset);
    }

    virtual ~CSingletonA()
    { 
        assert(m_pSingleton); 
        m_pSingleton = NULL; 
    }

    static T& GetInstance(void)
    { 
        assert(m_pSingleton); 
        return ( *m_pSingleton); 
    }
   
    static T* GetInstancePtr(void)
    { 
        return (m_pSingleton);
    }
};

template<typename T> T* CSingletonA<T>::m_pSingleton = NULL;

+ -

관련 글 리스트
118 [만해] Singletone의 구현 및 활용 강재호.만해 11541 2007/01/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.