디자인패턴 - Singleton

code_able·5일 전
0

Singleton 패턴 이란

클래스의 인스턴스가 오직 하나만 생성되도록 보장하며, 전역 접근이 가능하게 하는 디자인 패턴입니다. 주로 글로벌 상태를 유지해야 하거나, 자원을 공유해야 하는 경우에 유용합니다. 대표적인 예로 로그 파일 관리 객체, 설정 객체, 데이터베이스 연결 객체 등이 있습니다.

싱글톤 패턴을 사용하는 이유

  • 자원의 절약: 여러 번 인스턴스를 생성하지 않고, 하나의 인스턴스를 공유함으로써 메모리와 자원을 절약할 수 있습니다.
  • 전역 접근: 애플리케이션 전역에서 동일한 인스턴스를 참조할 수 있어 상태 관리와 접근이 간단해집니다.
  • 데이터 일관성: 특정 자원의 상태나 설정 값이 여러 인스턴스에서 충돌하거나 일관성이 깨지는 것을 방지합니다.

장점

  • 자원 절약 및 성능 최적화에 도움이 됩니다.
  • 애플리케이션 전체에서 동일한 인스턴스를 통해 일관된 상태 유지가 가능합니다.

단점

  • 전역 상태를 유지하기 때문에, 코드의 복잡성이 증가하고 의존성이 높아질 수 있습니다.
  • 다중 스레드 환경에서 싱글톤 객체의 동기화 처리가 필요할 수 있습니다.

싱글톤 패턴의 사용 예

  • 로그 객체: 여러 클래스가 동일한 로그 파일에 로그를 남길 때.
  • 설정 객체: 애플리케이션의 설정 값을 공유하는 객체.
  • 데이터베이스 연결 풀: DB와의 연결을 유지하고 공유해야 할 때.

구현

new 메서드를 사용하는 싱글톤 패턴

class Singleton:
    _instance = None  # 인스턴스 저장을 위한 클래스 변수

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super().__new__(cls)
        return cls._instance

# Example usage
singleton1 = Singleton()
singleton2 = Singleton()
print(singleton1 is singleton2)  # True, 두 객체는 동일한 인스턴스입니다.

데코레이터를 사용한 싱글톤 패턴

def singleton(cls):
    instances = {}

    def get_instance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]

    return get_instance

@singleton
class Singleton:
    pass

# Example usage
singleton1 = Singleton()
singleton2 = Singleton()
print(singleton1 is singleton2)  # True
profile
할수 있다! code able
post-custom-banner

0개의 댓글