λ°μν
Singleton Pattern
Singleton ν¨ν΄μ ν΄λμ€μ μΈμ€ν΄μ€κ° νλλ§ μμ±λλλ‘ λ³΄μ₯νκ³ , κ·Έ μΈμ€ν΄μ€μ μ κ·Όν μ μλ μ μ μ κ·Όμ μ μ 곡νλ ν¨ν΄μ λλ€.
- κ·Έλ¦¬κ³ νΉμ ν΄λμ€μ μΈμ€ν΄μ€κ° μ ν리μΌμ΄μ μ 체μμ νλλ§ μ‘΄μ¬ν΄μΌ ν λ μ¬μ©λ©λλ€.
- λν νΉμ§λ€μ μλμ μ μ΄λ³΄μλ©΄.
- ν΄λμ€μ λν λ¨μΌ κ°μ²΄λ₯Ό μμ±ν©λλ€.
- μ μ κ°μ²΄λ₯Ό μ 곡ν©λλ€.
- 곡μ λ 리μμ€μ λν λμ μ κ·Ό μ μ΄κ° κ°λ₯ν©λλ€.
- κΈλ‘λ² μμΈμ€ μ§μ μ μ 곡νλ, λ¨μ μ΄ κ±°μ΄ μλ κ²μ¦λ ν¨ν΄μ λλ€.
- μμ λ€μ΄μ΄κ·Έλ¨μ μμλ‘ λ³΄λ©΄, μμ±μλ₯Ό privateλ‘ μ μΈνκ³ , κ°μ²΄λ₯Ό μ΄κΈ°ν νλ static ν¨μλ₯Ό λ§λ€μ΄ ꡬνν μ μμ΅λλ€.
- 첫 νΈμΆμ κ°μ²΄κ° μμ±λκ³ , κ·Έν ν΄λμ€λ λμΌν κ°μ²΄λ₯Ό κ³μ λ°νν©λλ€.
class Singleton(object):
def __new__(cls):
if not hasattr(cls, 'instance'):
print('create')
cls.instance = super(Singleton, cls).__new__(cls)
else:
print('recycle')
return cls.instance
s1 = Singleton()
print(s1)
s2 = Singleton()
print(s1)
print(s1 is s2)
- μμ μ½λλ₯Ό 보면 ν κ°μ Singleton ν΄λμ€ μΈμ€ν΄μ€λ₯Ό μμ±ν©λλ€.
- μ΄λ―Έ μμ±λ μΈμ€ν΄μ€κ° μλ€λ©΄ μ¬μ¬μ© ν©λλ€.
ν΅μ¬ κ°λ
- κ³ μ ν μΈμ€ν΄μ€ 보μ₯: Singleton ν΄λμ€λ μΈμ€ν΄μ€κ° νλλ§ μμ±λλλ‘ ν©λλ€.
- μ μ μ κ·Όμ μ 곡: Singleton ν΄λμ€λ μ ν리μΌμ΄μ μ 체μμ μΈμ€ν΄μ€μ μ κ·Όν μ μλ λ°©λ²μ μ 곡ν©λλ€.
- κ²μΌλ₯Έ μ΄κΈ°ν: μΈμ€ν΄μ€κ° μ€μ λ‘ νμν λκΉμ§ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μλ λ°©μμ μ¬μ©ν©λλ€.
μ₯μ
- κ³ μ μΈμ€ν΄μ€ 보μ₯: νΉμ ν΄λμ€μ μΈμ€ν΄μ€κ° νλλ§ μ‘΄μ¬ν¨μ 보μ₯ν μ μμ΅λλ€.
- μ μ μν 곡μ : μ ν리μΌμ΄μ μ μμμ μ κ·Ό κ°λ₯ν μΈμ€ν΄μ€λ₯Ό ν΅ν΄ μνλ₯Ό 곡μ ν μ μμ΅λλ€.
- μΈμ€ν΄μ€ κ΄λ¦¬ μ©μ΄: μΈμ€ν΄μ€μ μμ±κ³Ό μ κ·Όμ μ€μμμ κ΄λ¦¬ν μ μμ΅λλ€.
λ¨μ
- κΈλ‘λ² μν μ¬μ©: μ μ μΈμ€ν΄μ€λ₯Ό μ¬μ©νλ―λ‘, μνλ₯Ό 곡μ νλ λ°©μμ΄ λ°λμ§νμ§ μμ κ²½μ° λ¬Έμ κ° λ μ μμ΅λλ€.
- ν μ€νΈ μ΄λ €μ: μ±κΈν€ μΈμ€ν΄μ€λ μ μ μνλ₯Ό κ°μ§λ―λ‘, μ λ ν μ€νΈμμ λ€λ₯Έ ν μ€νΈ κ°μ μν 곡μ λ‘ μΈν΄ ν μ€νΈκ° μ΄λ €μΈ μ μμ΅λλ€.
- λ©ν°μ€λ λ νκ²½ λ¬Έμ : λ©ν°μ€λ λ νκ²½μμ λκΈ°ν λ¬Έμ λ‘ μΈν΄ μΈμ€ν΄μ€κ° μ¬λ¬ κ° μμ±λ μ μμ΅λλ€.
Singleton & Metaclass
Metaclassλ₯Ό κ°λ¨ν μ€λͺ νμλ©΄, ν΄λμ€λ₯Ό λ§λλ ν΄λμ€λΌκ³ ν μ μμ΅λλ€.
- typeμ κ°μ²΄μ ν΄λμ€ μ’ λ₯λ₯Ό μμλΌ λλ μ¬μ©λμ§λ§, ν΄λμ€λ₯Ό λ§λ€μ΄ λΌ μλ μμ΅λλ€.
- typeμ μμλ°κ² λλ©΄, λ©νν΄λμ€κ° λλ©°, μ£Όλ‘ ν΄λμ€μ λμμ μ μ΄ν λ μ¬μ©λ©λλ€.
- λ©ν ν΄λμ€λ call ν¨μλ₯Ό ν΅νμ¬ κ°μ²΄ μμ±μ κ΄ν μ μ΄λ₯Ό ν μ μμ΅λλ€.
# example
class λ©νν΄λμ€μ΄λ¦(type):
def _new_(metacls, name, bases, namespace):
code
MetaClassμ λμ
class MyInt(type):
def _call_(cls, *args, **kwds):
print("myint", args)
print("Now do whatever you want with these objects...")
return type.__call__(cls, *args, **kwds)
class int(metaclass=MyInt):
def _init_(self, x, y):
self.x = x
self.y = y
i = int(4, 5)
- call Methodλ μ΄λ―Έ μ‘΄μ¬νλ ν΄λμ€μ κ°μ²΄λ₯Ό μμ±ν λ νΈμΆλλ νμ΄μ¬μ νΉμ Method μ λλ€.
- int ν΄λμ€λ₯Ό μμ±νλ©΄ MyInt λ©νν΄λμ€μ call Methodκ° νΈμΆλ©λλ€.
- κ°μ²΄ μμ±μ λ©νν΄λμ€κ° μ μ΄νλ€λ μλ―Έμ λλ€.
λ©νν΄λμ€κ° ν΄λμ€μ κ°μ²΄ μμ±μ μ μ΄ νλ€λ©΄ μ±κΈν€μ μμ±νλ μ©λλ‘ μ¬μ©ν μ μλ€λ μλ―Έκ° λ©λλ€.
class MetaSingleton(type):
_instances = {}
def __call__(cls, *args, **kwds):
if cls not in cls._instances:
cls._instances[cls] = super(MetaSingleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class Box(metaclass=MetaSingleton):
pass
b1 = Box()
b2 = Box()
print(b1 == b2)
- λ©νν΄λμ€μ call ν¨μ λ΄λΆμ μΈμ€ν΄μ€ μμ±μ¬λΆλ₯Ό νμΈνλ λ‘μ§μ΄ μμΌλ©°, λ©νν΄λμ€μ μν΄ SingletonμΌλ‘ μ§μ λ Box ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±λ λ Metaclassμ call ν¨μκ° νΈμΆλλ©΄μ Boxμ μμ±μ μ μ΄ν©λλ€.
- μ΄λ, Singleton μ±μ§μ κ°μ§κ² λ©λλ€.
Singleton Pattern νμ© μ¬λ‘
DBλ₯Ό νμ©νλ ν΄λΌμ°λ μλΉμ€λ₯Ό μκ°ν΄λ³΄κ² μ΅λλ€.
- ν΄λΌμ°λ μλΉμ€ λ΄ DBμ μ κ·Όνλ μ¬λ¬κ°μ λͺ¨λμ΄ μμ μ μμ΅λλ€.
- μ¬λ¬ κ°μ μλΉμ€κ° ν κ°μ DBλ₯Ό 곡μ νκ³ μλ ꡬ쑰λ₯Ό λ μ¬λ¦¬λ©΄ λ©λλ€.
import sqlite3
class MetaSingleton(type):
_instances = {}
def __call__(cls, *args, **kwds):
if cls not in cls._instances:
cls._instances[cls] = super(MetaSingleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class Database(metaclass=MetaSingleton):
connection = None
def connest(self):
if self.connection is None:
self.connection = sqlite3.connect('db.sqlite3')
self.cursorobj = self.connection.cursor()
return self.cursorobj
db1 = Database().connect()
db2 = Database().connect()
print(db1, db2)
Monostate Singleton Pattern
Monostate Sington Patternμ λͺ¨λ κ°μ²΄κ° κ°μ μνκ° κ³΅μ νλ ν¨ν΄ μ λλ€.
- Singleton Patternμ μ μλ λ°λμ νκ°μ ν΄λμ€ κ°μ²΄λ§ μ‘΄μ¬ν΄μΌν¨
- νμ§λ§, Alex Martelliλ μνλ₯Ό 곡μ νλ μΈμ€ν΄μ€κ° νμνλ€κ³ μ£Όμ₯ νμ΅λλ€.
- κ°μ²΄μ μμ±μ¬λΆλ³΄λ€, κ°μ²΄μ μνμ νμκ° λ μ€μνλ€κ³ μκ°νκΈ° λλ¬Έμ λλ€.
class MonoState:
__shared_state = {}
def __init__(self):
self.__dict__ = self.__shared_state
self.x = 1
self.y = 2
self.z = 3
pass
ms1 = MonoState()
ms2 = MonoState()
print(ms1)
print(ms2)
ms2.x = 20
ms1.y = 20
ms2.z = 30
print(ms1.x, ms1.y, ms1.z)
print(ms2.x, ms2.y, ms2.z)
print(ms1.__dict__)
print(ms2.__dict__)
Pythonμμ λͺ¨λ λͺ¨λλ€μ Singleton
Pythonμ import λ°©μ λλ¬Έμ λͺ¨λ λͺ¨λλ€μ κΈ°λ³Έμ μΌλ‘ singleton μ λλ€.
- νλ² νμ΄μ¬μ μλλ°©μμ μ΄ν΄λ³΄λ©΄,
- python moduleμ΄ import λμλμ§ νμΈν©λλ€.
- importλμλ€λ©΄ ν΄λΉ κ°μ²΄λ₯Ό λ°ννκ³ μλμλ€λ©΄ importλ₯Ό instanceν ν©λλ€.
- λͺ¨λμ importμ λμμ μ΄κΈ°νλμ§λ§, κ°μ λͺ¨λμ λ€μ importνλ©΄ μ΄κΈ°νλμ§ μμ΅λλ€.
- κ·Έλμ, ν κ°μ κ°μ²΄λ§ μ μ§νκ³ λ°ννλ Singleton λ°©μμ λλ€.
λ°μν
'πΊοΈ Design Pattern' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Design Pattern] Adapter Pattern - μ΄λν° ν¨ν΄ (0) | 2024.05.27 |
---|---|
[Design Pattern] Proxy Pattern - νλ‘μ ν¨ν΄ (0) | 2024.05.27 |
[Design Pattern] Builder Pattern - λΉλ ν¨ν΄ (0) | 2024.05.21 |
[Design Pattern] Prototype Pattern - νλ‘ν νμ ν¨ν΄ (0) | 2024.05.21 |
[Design Pattern] Abstract Factory Pattern - μΆμ ν©ν 리 ν¨ν΄ (0) | 2024.04.08 |