Search Results for '디자인 패턴/5-1. 싱글턴( Singleton )'

1 POSTS

  1. 2012.10.22 싱클턴 패턴에 대해 알아보자

싱클턴 패턴에 대해 알아보자

Posted 2012. 10. 22. 15:31

1. 싱글턴이란 ? 

사용자가 프토젝트에서 특정 클래스에 대해 그 클래스가 프로젝트에 " 단 한개만 " 존재해야 하거나

전역변수와 같이 전역적인 접근점이 필요한 경우

-> 객체가 프로젝트에서 단 한개만 존재해야 할 때, 전역변수와 같이 전역적인 접근이 필요할때


2. 장점

단 한개만 존재하기때문에 통제가 자유롭다.

객체 갯수에 대해 유연하다

전역적인 접근이 가능하다.


3. 특징

해당 클래스의 포인터와 인스턴스를 얻어오는 함수를 static 으로 선언한다.

-> static의 장점

-> 정점 객체로서 스택영역에 할당되고, 프로그램 종료시 알아서 제거 된다.

-> 해당 객체가 선언되지 않았어도 static으로 메모리가 잡혀있어서 접근이 가능하다

-> class를 static으로 선언을 하게 되면 자신이 가지고 있는 sizeof 크기만 올리면 된다.

     그렇기 때문에 전역으로 쓰인다해도 이 정도의 메모리가 잡히기 때문에 메모리 낭비가 덜하다.


클래스 객체의 생성자와 소멸자를 private로 두어 외부 생성을 막는다

내부에서 객체를 생성하고 제거하는 소스를 구현 한다.


4. 단점

많이 사용 하게 되면 전역 변수를 많이 사용 하는 것과 같은 단점이 발생한다( 스파게티 소스..)



#pragma once

#include <iostream>

using namespace std;


class cSingleton

{

private:

static cSingleton* m_pInstance;        // 해당 클래스의 포인터로 내부 객체 생성에 쓰인다.

//----------------------                                                                                                   // 사용할 변수, 함수 정의                                                                                                   //----------------------

private:

cSingleton(){}

virtual ~cSingleton(){}


public:

// 외부에서 해당 클래스를 접근하는 함수

// 처음 접근 할 때는 클래스를 생성

// 이후는 해당 포인터만 반환

static cSingleton* GetInstance()

{

if( m_pInstance == NULL )

{

m_pInstance = new cSingleton;

}

return m_pInstance;

}


// 내부에서 생성했던 객체를 제거하는 함수

// 종료전에 호출해서 메모리 누수를 없애야됨

void Destroy()

{

if( m_pInstance != NULL )

{

delete m_pInstance;

m_pInstance = NULL;

}

}

};

// 포인터 변수를 NULL로 초기화

cSingleton* cSingleton::m_pInstance = NULL;