반응형
싱글톤 패턴
- 글로벌하게 접근 가능한 단 한 개의 객체만을 허용하는 패턴
- 주로 로깅이나 디비, 프린터 스풀러 등 동일한 리소스에 대한 동시 요청의 충돌을 막기 위해 사용
- 목적
- 클래스에 대한 단일 객체 생성
- 전역 객체 제공
- 공유된 리소스에 대한 동시 접근 제어
- 구현 코드
class Singleton(object):
# __new__를 오버라이드 한다.
def __new__(cls):
# hasattr는 객체가 instance 속성을 가지고 있는지 확인한다. (객체의 존재 유무 확인)
if not hasattr(cls, 'instance'):
# 클래스 객체가 없다면 객체를 할당한다.
cls.instance = super(Singleton, cls).__new__(cls)
# 기존 또는 할당한 객체를 반환한다.
return cls.instance
obj = Singleton()
print("created", obj)
other_obj = Singleton()
print("created", other_obj)
"""
결과값 - 동일한 객체가 호출된다.
created <__main__.Singleton object at 0x101033640>
created <__main__.Singleton object at 0x101033640>
"""
게으른 초기화 (Lazy instantiation)
- 모듈을 임포트 할 때 아직 필요하지 않은 시점에 실수로 객체를 미리 생성하는 경우가 있다.
- 게으른 초기는 리소스가 제한적일 때 객체가 꼭 필요한 시점에 생성하는 방식이다.
- 구현 코드
class Singleton:
__instance = None
def __init__(self):
# 인스턴스가 생성되지 않을 때 메시지
if not Singleton.__instance:
print("__init__ method called...")
# 인스턴스가 생성되었을 때 메시지
else:
print("Instance already created:", self.getInstance())
@classmethod
def getInstance(cls):
# 인스턴스가 없다면 인스턴스를 생성하는 메서드
if not cls.__instance:
cls.__instance = Singleton()
return cls.__instance
obj = Singleton() # 인스턴스를 생성하지 않음
# __init__ method called...
print(f"{obj=}")
# obj=<__main__.Singleton object at 0x100ca7610>
print("created", Singleton.getInstance()) # 인스턴스 생성
# __init__ method called...
# created <__main__.Singleton object at 0x100ca75e0>
other_obj = Singleton() # 인스턴스가 이미 생성되었음
# Instance already created: <__main__.Singleton object at 0x100ca75e0'
print(f"{other_obj=}") # 기존 인스턴스와 동일함
# other_obj=<__main__.Singleton object at 0x100ca75b0>
여기서 한 가지 의문은 메서드로 인스턴스를 생성하기 전, `print(f"{obj=}")` 에서 이미 객체 식별자가 존재한다는 점이다.
모듈 싱글톤
- 파이썬은 임포트 방식 때문에 모든 모듈은 기본적으로 싱글톤이다.
- 파이썬 작동 방식
- 모듈이 임포트 됐는지 확인한다.
- 임포트 됐다면 해당 객체를 반환하고 안 됐다면 임포트하고 인스턴스화 한다.
- 모듈은 임포트와 동시에 초기화된다. 하지만 같은 모듈을 다시 임포트 하면 초기화하지 않는다. 한 개의 객체만 유지하고 반환하는 싱글톤 방식이다.
반응형
'나는 이렇게 본다 > 파이썬 디자인 패턴' 카테고리의 다른 글
퍼사드 패턴 (0) | 2022.05.31 |
---|---|
팩토리 메소드, 추상 팩토리 패턴 (0) | 2022.05.30 |
심플 팩토리 패턴 (0) | 2022.05.27 |
모노스테이트, 메타클래스, 싱글톤 구현예시 (0) | 2022.05.25 |
디자인 패턴 개요 (0) | 2022.05.23 |