Singleton Pattern(싱글턴 패턴)
조회수 31.4k 등록일 2018.10.07 17:24:30

디자인 패턴중에서 싱글턴(Singleton) 패턴에 대해서 알아보자.


기본 개념

싱글턴 패턴은 오래전부터  많이 알려지고 사용된 디자인 패턴중에 하나로

하나의 클래스에 인스턴스를 하나만 만들어야하는 경우 사용되는 패턴이다.

최초 생성 이후에 호출되는 생성자는 최초 인스턴스를 리턴한다.


싱글턴은 다음과 같은 상황에 사용된다.

  1. 공유자원(shared resource)에 대한 동시접근(concorrenct access)을 제어할 필요가 있는 경우.
  2. 여러 시스템에서 하나의 자원에 접근하는 지점이 필요한 경우.
  3. 유일객체(unique object)가 필요한 경우.


일반적으로 싱글턴이 사용되는 예는 다음과 같다.

  1. logging class.
  2. print spooler.
  3. DBCP(Dabasebase Connection Pool).
  4. File Manager.
  5. 전역 상태를 담고 있는 읽기 전용 싱글턴.


구현

구현은 파이썬 언어로 작성하였다. 

  1. class Singleton:
  2. def __new__(cls, *args, **kwargs):
  3. if not hasattr(cls, 'instance'):
  4. cls.instance = super(Singleton, cls).__new__(cls)
  5. return cls.instance
  6.  
  7. a = Singleton()
  8. b = Singleton()
  9. print(a) #<__main__.Singleton object at 0x10d4d5278>
  10. print(b) #<__main__.Singleton object at 0x10d4d5278>

같은 객체임을 알 수 있다. 


아래는 위키피디아에서 작성되어 있는 예제 코드이다.

  1. class Singleton(type):
  2. def __init__(cls, name, bases, dict):
  3. super(Singleton, cls).__init__(name, bases, dict)
  4. cls.instance = None
  5.  
  6. def __call__(cls, *args, **kw):
  7. if cls.instance is None:
  8. cls.instance = super(Singleton, cls).__call__(*args, **kw)
  9. return cls.instance
  10.  
  11. class MyClass(object):
  12. __metaclass__ = Singleton
  13.  
  14. print MyClass()
  15. print MyClass()


Descorator 사용

  1. def singleton(cls):
  2. instance = []
  3. def getinstance():
  4. if not len(instance):
  5. instance.append(cls())
  6. return instance[0]
  7. return getinstance
  8.  
  9. @singleton
  10. class MyClass:
  11. ...


참고 자료

- Python Design Patterns

- wikipedia