2015년 12월 28일 월요일

Dynamic singleton 패턴 예제

Write, Data, Read 역할을 수행하는 Class를 만들어서 Data Instance를 전역변수로 지정하여 사용할 경우, Dynamic Singleton 패턴을 통해 사용할 경우를 비교하고 Dynamic singleton 패턴을 사용할 때 얻을 수 있는 이점을 알아보자.

참고 블로그: http://vallista.tistory.com/entry/1-Singleton-Pattern-in-C


어차피 간단한 수준의 프로젝트를 수행하기 때문에 전부 다 읽고 구현할 필요는 없고, 
메모리 해제를 고려하지 않은 Dynamic singleton에 대해서만 소개한다.
전역변수 방법 또는 singleton 방법으로 예제를 돌릴 때 각각 uncomment해야 하는 코드가 다르므로 주의하여 돌려보자.

//main.cpp
#include <iostream>
#include "CWrite.h"
#include "CRead.h"

int main()
{   
    CWrite* pWrite = new CWrite();
    CRead* pRead = new CRead();

    pWrite->WriteToData("hello!");
    pRead->PrintFromData();

    system("pause");
    return 0;
}

//Data.h
#pragma once
#include<iostream>
#include<string>

class CData
{
public:
    //singleton 방법으로 할 경우 uncomment
    //static CData* pData;
    //static CData* GetSharedData();

    //전역변수 방법으로 할 경우 uncomment
    //static CData sData;
    
    std::string msg;
};

//Data.cpp
#include "Data.h"

CData* CData::pData = nullptr;

CData* CData::GetSharedData()
{
    if (pData == nullptr)
        pData = new CData();
    return pData;
}

//Write.h
#pragma once
class CWrite
{
public:
    void WriteToData(char* msg);
};

//Write.cpp
#include "Write.h"
#include "Data.h"

void CWrite::WriteToData(char* msg)
{
    //singleton 방법으로 할 경우 uncomment
    //CData* pData = CData::GetSharedData();
    //pData->msg.append(msg);

    //전역변수 방법으로 할 경우 uncomment
    //CData::sData.msg.append(msg);
}

//Read.h
#pragma once

class CRead
{
public:
    void PrintFromData();
};

//Read.cpp
#include "Read.h"
#include "Data.h"
#include<iostream>

//전역변수 방법으로 할 경우 uncomment
//CData CData::sData;

void CRead::PrintFromData()
{
    //singleton 방법으로 할 경우 uncomment
    //CData* pData = CData::GetSharedData();
    //std::cout >> pData->msg.c_str() << std::endl;
    
    //전역변수 방법으로 할 경우 uncomment
    //std::cout >> CData::sData.msg.c_str() << std::endl;
}

댓글 없음:

댓글 쓰기