단 하나의 인스턴스만 갖도록 보장하는 디자인 패턴.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
#include <iostream>
template <typename T>
class SingleTon {
private:
static T* Instance;
protected:
SingleTon() {}
~SingleTon() {}
SingleTon(const SingleTon& instance) {};
public:
static T* GetInstance()
{
if (!Instance)
Instance = new T();
return Instance;
}
};
template <typename T> T* SingleTon<T>::Instance;
//상속받은 클래스
class AA :public SingleTon<AA> {
public:
void printHellowWorld() { printf("Hellow World"); }
};
int main()
{
AA::GetInstance()->printHellowWorld();
}
|
코드를 보면 getInstance함수에서 instance가 있는지 확인하고 없다면 만들어주고 있으면 Instance를 반환 해준다.
이런식으로 인스턴스를 하나만 만들어 그 인스턴스를 사용하는 패턴이다.
장점
단점
Lazyitaliztion(게으른 초기화, 지연 초기화)
객체 생성을 지연하는 전술
Lazyitaliztion이란 객체를 필요할 때 만드는것이다.
1
2
3
4
5
6
|
//그냥 초기화하는 경우
Class Student {
private List<Grade> grades = new ArrayList<Grade>();
}
|
1
2
3
4
5
6
7
8
9
10
|
//게으른 초기화를 사용하는경우
Class Student {
private List<Grade> grades;
...
...
public List<Grade> createGrades(){
if( grades != null)
return grades;
return new ArrayList<Grade>();
}
|
적합한 경우
피해야 하는 경우