[Design Pattern] 싱글톤 패턴

Singleton Pattern

오직 한 개의 클래스 인스턴스만을 갖도록 보장하고 이에 대한 전역적인 접근을 허용하는 패턴이다.

활용성

  1. 클래스의 인스턴스가 오직 하나여야 함을 보장하고, 잘 정의된 접근점으로 모든 사용자가 접근할 수 있도록 해야할 때
  2. 유일한 인스턴스가 서브클래싱으로 확장되어야 하며, 사용자는 코드의 수정 없이 확장된 서브클래스의 인스턴스를 사용할 수 있어야 할 때

싱글톤 패턴 사용에 따른 결과

유일하게 존재하는 인스턴스로의 접근 통제

싱글톤 클래스는 인스턴스를 캡슐화하기 때문에 이 클래스에서 사용자가 언제, 어떻게 이 인스턴스에 접근할 수 있는지에 대한 제어가 가능하다.

namespace 제어

싱글톤 패턴은 전역변수보다 네임스페이스 관점에서 우수하다.

연산 및 표현의 정제

싱글톤 클래스는 상속이 가능하기 때문에 상속한 서브클래스를 통해 새로운 인스턴스를 만들 수 있다. 이를 통해 런타임에 필요한 클래스의 인스턴스를 사용한 프로그램의 구성이 가능하다.

인스턴스 개수 변경의 자유로움

상황이 바뀌어 싱글톤 클래스의 인스턴스 개수를 하나가 아닌 여러개로 변경하고 싶을 때 변경이 용이하다.

싱글톤

구조

싱글톤의 구조는 다음과 같다.

Singleton Pattern Diagram

C++ 구현

1
2
3
4
5
6
7
8
9
10
11
12
void SingletonPattern::SingletonPattern()
{
getSingletonPattern();
}

void SingletonPattern::getSingletonPattern()
{
Singleton* callFirst = Singleton::getInstance();
Singleton* callSecond = Singleton::getInstance();
std::cout<<"MEMORY OF FIRST : "<<(void*)&callFirst<<std::endl;
std::cout<<"MEMORY OF SECOND : "<<(void*)&callSecond<<std::endl;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Singleton
{
static Singleton* instance;
protected:
Singleton()
{
std::cout<<"Singleton Instance Constructed"<<std::endl;
}
public:
static Singleton* getInstance();
};

Singleton* Singleton::instance = new Singleton();

Singleton* Singleton::getInstance()
{
return instance;
}
1
2
3
Singleton Instance Constructed
MEMORY OF FIRST : 0x7ffee8402818
MEMORY OF SECOND : 0x7ffee8402810

java 구현

1
2
3
4
5
public class Client {
public static void main(String[] args) {
Singleton instance = Singleton.getInstance();
}
}
1
2
3
4
5
6
7
8
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}

public static Singleton getInstance() {
return instance;
}
}
Author: Song Hayoung
Link: https://songhayoung.github.io/2020/08/13/Design%20Pattern/SingletonPattern/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.