서버에서 살아남기

디자인 패턴 - 싱글톤 디자인 패턴 본문

python

디자인 패턴 - 싱글톤 디자인 패턴

개발롬 2023. 8. 1. 16:54

python에 초점을 맞춘 디자인 패턴에 대해서 정리하겠습니다. 해당 내용은 에 있는 내용을 정리한 내용입니다.

디자인 패턴 종류

  • GoF 디자인 패턴 책에서는 디자인 패턴을 다음의 3개의 범주로 분류합니다.
    1) 생성 패턴
    2) 구조 패턴
    3) 행위 패턴
1) 생성 패턴
- 객체가 생성 되는 방식을 기반으로 작동합니다.
- 객체 생성 관련 상세 로직은 숨긴다.

2) 구조 패턴
- 클래스와 객체를 더 큰 결과물로 합칠 수 있는 구조로 설계한다.
- 구조가 단순해지고, 클래스와 객체 간의 상호관계를 파악 할 수 있다.

3) 행위 패턴
- 객체는 상호작용하지만 느슨하게 결합돼야 한다.

싱글톤 디자인 패턴(생성 패턴)

  • 특정 클래스의 인스턴스가 단 하나만 생성되도록 보장하고 어디서든지 이 인스턴스에 접근 할 수 있도록 하는 패턴입니다.
  • 예를 들어, DB연결, 로깅 객체를 통해 로그 파일 생성하기와 같이 애플리케이션 전체에서 공유되어야 하는 인스턴스가 필요할 때 유용합니다.
class Singleton(object):
    def __new__(cls):
        if not hasattr(cls, 'instance'):
            cls.instance = super(Singleton, cls).__new__(cls)
        return cls.instance

s = Singleton()
print("s : ", s)
s1 = Singleton()
print("s1 : ", s1)

s :  <__main__.Singleton object at 0x10325c810>
s1 :  <__main__.Singleton object at 0x10325c810>

객체 지향 언어에서 'new' 메소드는 클래스의 새로운 인스턴스를 생성할 때 호출되는 메소드로 실제로 인스턴스가 생성하고 해당 인스턴스를 반환합니다.
위 코드에서는 Singleton 클래스의 new 메소드가 새 인스턴스를 생성하는 역할을 합니다. hasattr에서 'instance' 라는 속성이 있는지 확인하고 없다면 새로운 인스턴스를 생성하고 'instance'라는 속성에 저장합니다.
이렇게 생성한 인스턴스는 Singleton 클래스의 모든 인스턴스가 공유하게 되어 어떤 인스턴스에서든 같은 'instance'의 속성을 가지게 되어 싱글톤 패턴이 구현됩니다.

게으른 초기화 혹은 지연 초기화(Lazy Initialization)

  • 싱글톤 패턴 기반으로 하는 초기화 방식이다. 모듈을 임포트 할 때 필요하지 않은 시점에 실수로 객체를 미리 생성하는 경우가 있는데 게으른 초기화는 객체, 값, 또는 복잡한 계산 결과가 실제로 필요할 때까지 생성 또는 계산을 연기하는 설계 전략입니다.
class Singleton:
    __instance = None
    def __init__(self):
        if not Singleton.__instance:
            print("__init__mehtod called")
        else:
            print("Instance already created:", self.getInstance())

    @classmethod
    def getInstance(cls):
        if not cls.__instance:
            cls.__instance = Singleton()
        return cls.__instance

s = Singleton() ## 클래스를 초기화했지만 객체는 생성하지 않음
print(Singleton.getInstance()) ## 객체 생성
s1 = Singleton() ## 객체는 이미 생성됨

모노스테이트 싱글톤 패턴

  • 싱글톤 패턴의 한 형태이지만, 객체가 여러개 존재할 수 있으며 그 상태는 모든 객체에 걸쳐 공유된다는 것이 특징인 패턴입니다. 즉 모든 인스턴스는 같은 상태를 공유하기때문에 한 인스턴스에서 상태를 변경하면 모든 인스턴스에 대해 상태가 변경됩니다.
class MonoState:
    _shared_state = {}

    def __init__(self):
        self.__dict__ = self._shared_state
        self.state = 1

m1 = MonoState()
m2 = MonoState()
m1.state = 2

print(m1.state)  # 출력: 2
print(m2.state)  # 출력: 2

단점

  • 전역 변수의 값이 실수로 변경 됐을 때, 애플리케이션의 다른 부분에서 사용될 수 있다.
  • 싱글톤은 하나의 객체만을 생성하기 때문에 같은 객체를 여럿이 참조할 수 있다.

'python' 카테고리의 다른 글

디자인 패턴 - 프록시 디자인 패턴  (0) 2023.08.09
이해가 안가서 정리하는 FastAPI 동작 원리  (0) 2023.07.24
Garbage Collection 이란?  (0) 2023.07.22
SQLAlchemy + alembic 마이그레이션  (0) 2023.07.22
python 파일  (2) 2023.03.11