1. An issue
● 오직 하나의 인스턴스를 구현하여 유지할 수 있는가?
2. Why
● 오직 하나의 인스턴스만을 얻어와서 그것을 제어
● 다수의 인스턴스 존재시 상호간의 영향으로 예상외의 버그 발생
● 하나의 클래스에서 각각의 인스턴스를 얻어오면 엄청난 리소스의 손실 발생
● 개별적인 인스턴스로 많은 Garbage가 발생하고 CPU의 낭비
● 하나의 인스턴스만을 얻어온다는 것은 메모리 공유의 효과
3. An example
● 프린터 스풀러 - 각각의 인스턴스 발생 시 시스템의 엄청난 리소스와 CPU의 낭비
● 데이터 베이스 엔진 - 하나의 데이터 베이스로 여러 사용자에게 같은 정보 공유, 효과적인 관리
● 사용자 인증 시스템 - 하나의 로컬 pc에서 하나의 user ID와 password를 얻어와 핸들링
● DirectX의 컴포넌트 - DirectDraw, Direct3D, DirectSound등은 하나만 존재
LPDIRECTDRAW7 g_pDDraw 로 전역변수화
※프린터 스풀러 - 인쇄 출력 속도와 컴퓨터 시스템의 처리 속도 차이를 위해 존재하는 임시저장공간 관리자
4. A solution
4-1. 전역변수에 의한 객체 생성, 관리
○ 전역변수에 의해서 main함수에서 여러 번 CreateCock()함수를 호출해도 하나의 객체만 유지
class Cock{
public :
Cock(){}
~Cock(){}
};
Cock *pCock = 0;// 전역변수로 선언
Cock *CreateCock()
{
if(pCock == 0){
pCock = new Cock;
return pCock;
}
return 0;
}
void main()
{
Cock *pCock1 = CreateCock();
Cock *pCock2 = CreateCock();
Cock *pCock3 = CreateCock();
}
○ 문제점
◆ 직접 생성자를 이용해서 생성하면 여러개의 객체 생성 가능
◆ 전역 변수 방식의 경우에는 해당 객체가 사용되든 안되든 무조건 객체 생성
◆ 전역 변수에 해당하는 객체들의 생성 순서를 지정해야 할 경우 문제 발생
◆ 처음부터 객체를 초기화 하고 객체에 대한 정보를 알아야한다.
void main()
{
Cock* pCock1 = CreateCock();
Cock* pCock2 = new Cock;
}
○ 생성자가 private로 되어 있으므로 main에서 Cock* pCock3 = new Cock로 생성할 수 없다.
○ CreateCock()에 의해서만 객체가 생성 되는데 static으로 선언되어 있으므로 하나의 객체만 생성
class Cock{
public :
static Cock* CreateCock(){
if(pCock == 0){
pCock = new Cock;
}
return pCock;
}
private:
Cock(){}
~Cock(){}
static Cock* pCock; // 정적 멤버 변수
};
void main()
{
Cock* pCock1 = Cock::CreateCock();
Cock* pCock2 = Cock::CreateCock();
}
5. A point to be considered (고려사항)
5-1. 복제 생성자를 명시적으로 정의 하지 않으면 C++컴파일러에서 public영역에 복제 생성자가 제공되어 객체가 생성. 반드시 복제 생성자도 protected, private영역에 정의
Cock* pCock1 = Cock::CreateCock();
Cock aCock(*pCock1); //복제 생성자 호출
5-2. 하위 클래스 존재 시에 Cock의 생성자에 의해서 객체 생성외에 상속 받은 하위클래스의 생성자는 자유롭게 이루어 지므로 정확하게 Cock자료형에 속하는 객체의 수를 전체적으로 제한하지 못한다.
5-3. CreateCock의 리턴형이 포인터가 되야만 하위 클래스에서 생성된 객체가 제대로 관리 되고 임의로 객체를 삭제하면 클래스에서 객체를 관리하는데 객체는 삭제되면 상위 클래스에서 그 포인터 값을 가지고 있는 객체는 여전히 남아 있으므로 Dangling Pointer문제가 발생한다.
6. Reference
http://cafe.naver.com/jzsdn.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=4886
'기타 > Design pattern' 카테고리의 다른 글
Decorator pattern (0) | 2009.04.27 |
---|---|
Builder pattern (0) | 2009.04.27 |
Adapter pattern (0) | 2009.04.27 |
Abstract Factory pattern (0) | 2009.04.27 |
소프트웨어 개발 기본 요소 (0) | 2009.04.27 |