Singleton Pattern (Creational Pattern)
싱글톤 패턴 (Singleton Pattern):
싱글톤 패턴은 어떤 클래스가 최대 하나의 인스턴스만을 생성하도록 보장하는 패턴이다.
싱글톤 패턴은 인스턴스가 하나만 생성되도록 보장하므로, 전역 객체를 사용할 떄 유용하당.
또한, 싱글톤 패턴을 사용하면, 인스턴스가 하나만 생성되므로, 메모리 낭비를 방지할 수 있다.
다시 말해, 공유된 리소스 에 대한 동시 접근을 제어할 수 있다.
싱글톤 패턴은 하나의 인스턴스만 사용하게 강제하는 패턴이다 .
만약 추가로 인스턴스를 만드려는 시도가 있다면 ? 이미 생성된 인스턴스를 재활용한다 .
싱글톤 패턴을 사용하기 위해서는 ?
__new__ 에서 인스턴스를 생성하고, __init__ 에서 인스턴스를 초기화 하는데,
__new__ () 메소드를 오버라이딩 해줘야한다.
오버라이딩은 다음과 같이 해준다,
만약 인스턴스가 없다면
-> 인스턴스를 생성하고
만약 인스턴스가 있다면
-> 이미 생성된 인스턴스를 반환한다.
object 클래스를 상속받는 이유는,
object 클래스는 __new__ 메서드를 가지고 있기 때문이다.
init vs new
__new__ 메서드는 cls라는 파라미터를 받아야하는데 이것은 Class자신을 가리킨다.
__init__ 메서드 내에서 선언한 Attributes는 객체가 생성될 때 초기화된다.
__init__ 메서드 로 초기화하는 것은, 고유한 데이터 값을 가진 객체를 생성할 때 좋다.
__init__ 메서드 외부에서 Attributes를 선언하면, (객체의 속성이 아니라)클래스 속성이 된다.
!! 클래스의 Attributes가 되면, 클래스의 모든 인스턴스에서 공유된다 !!
이러한 클래스 특성은 클래스의 모든 개체에 공통적인 데이터를 저장하는 데 유용하게 사용될 수있다
싱글톤 패턴의 구현 (오브젝트 상속)
# object를 상속받는 Singleton 클래스를 정의한다.
class Singleton(object):
def __new__(cls):
if not cls.hasattr(cls, 'instance'):
cls.instance = super(Singleton, cls).__new__(cls)
else:
print("인스턴스가 이미 생성되었습니다.")
return cls.instance
s1 = Singleton() # 처음으로, 인스턴스가 생성
print(s1)
s2 = Singleton() # 이미 생성된 인스턴스를 반환
print(s2)
# s1 과 s2는 같은 인스턴스를 가리킨다.
print(s1 is s2) # True
Singleton & MetaClass
meta class 는 클래스를 만드는 클래스이다.
class MetaClass(type):
def __new__(cls, name, bases, attrs):
print("MetaClass.__new__")
return super().__new__(cls, name, bases, attrs)
def __init__(cls, name, bases, attrs):
print("MetaClass.__init__")
super().__init__(name, bases, attrs)
MetaClass 는 type 클래스를 상속받는다.
type 클래스는 모든 클래스의 부모 클래스이다.
type 클래스는 __new__ 와 __init__ 메서드를 가지고 있다.
어떤 클래스가 type 클래스를 상속받게되면, MetaClass 가 된다.
MetaClass 는 __call__ 메서드를 통해 인스턴스를 생성에 대한 제어를 할 수 있다.
메타 클래스는 ,메타 클래슬 상속받은 클래스를 제어할 때 사용되는데, __call__ 메서드 를 이용해 제어한다.
싱글톤 패턴의 구현 (메타클래스 상속)
class MetaSingleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(MetaSingleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class Box(metaclass=MetaSingleton):
pass
box1 = Box()
box2 = Box()
print(box1 is box2) # True
파이썬 모듈은 ?
파이썬의 import 방식은, 모듈을 로드하는 것이다.
모듈은 기본적으로 싱글톤이다.
- 파이썬 모듈이 import 지 확인
- import 되었다면, 객체 반환
- import 되지 않았다면, import를 instance 화 한다.
- 모듈은 import 와 동시에 초기화 된다.
- 같은 모듈을 import 하면, 다시 초기화 하지않는다.
- 따라서 한 개의 객체만 유지하고 반환 하는 싱글 톤방식이다.
728x90
반응형
'Dev > DesignPattern' 카테고리의 다른 글
[DesignPattern] Adapter Pattern (0) | 2023.04.26 |
---|---|
[DesignPattern] Prototype Pattern (0) | 2023.04.25 |
[DesignPattern] Builder Pattern (0) | 2023.04.25 |
[DesignPattern] Abstract Factory Pattern (0) | 2023.04.25 |
[DesignPattern] Factory Method Pattern (0) | 2023.04.24 |