글로벌하게 접근 가능한 단 한개의 객체만을 허용하는 패턴이다.
해당 패턴은 다음과 같은 성격을 가진다.
- 클래스에 대한 단일 객체를 생성한다.
예) DB 접근시, Client가 여럿이되, 하나의 객체만 강제하는 경우.
-> 단일 객체가 아니면 혼동이 생길 수 있다.
-> Singleton Pattern을 통해 단일 객체를 이용한다.- 전역 객체를 제공한다.
- 공유된 리소스에 대한 동시 접근 제어
- 글로벌 액세스 지점을 제공하는, 단점이 거의 없는 검증된 패턴이다.
- 생성자를 private로 선언하고, 객체를 초기화하는 static 함수를 만들어 구현할 수 있다. 이때, 첫 호출에 객체가 생성되고 그 후 클래스는 동일한 객체를 계속 반환한다.
- 하나의 Singleton 클래스 인스턴스를 생성하고, 이미 생성된 인스턴스가 있다면 재사용한다.
Metaclass의 call 함수 내부에 인스턴스 생성여부를 확인하는 로직이 있으며, 클래스에 의해 Singleton으로 지정된 Box 클래스의 인스턴스가 생성될 때, Metaclass의 call 함수가 호출되면서 Box의 생성을 제어함 (Singleton 성질을 가지게 된다.)
Singleton Pattern의 정의는 반드시 한 개의 클래스 객체만 존재하여야 한다.
하지만, Alex Martelli는 상태를 공유하는 인스턴스가 필요하다고 주장했다.
즉, 객체의 생성여부보다, 객체의 상태와 행위가 더 중요한 것이다.
해당 패턴은 모든 객체가 같은 상태를 공유하는 패턴이다.
해당 코드 사진을 통해 자세하게 파악할 수 있다.
파이썬에서는 import 방식 때문에 모든 모듈은 기본적으로 싱글톤이다.
파이썬의 작동방식을 살펴보면
싱글톤 패턴은 효율적이지만 단점도 존재한다.
DB를 활용하는 클라우드 서비스를 생각해보자.
이 문제에 관해서는 다음을 생각해볼 수 있다.
클라우드 서비스 내 DB에 접근하는 여러 개의 모듈이 있을 수 있다.
여러 개의 서비스가 한 개의 DB를 공유하고 있는 구조를 떠올리면 된다.
