Daily Develope

[Python] Pattern - Singleton (싱글톤) 본문

Develope/Python

[Python] Pattern - Singleton (싱글톤)

noggame 2022. 1. 8. 22:22

 

Singleton

 

ㅇ 사용 목적

- 하나의 클래스가 오직 하나의 인스턴스만을 가지도록하여, 해당 인스턴스를 전역에서 접근 가능하도록 제공

- 주로 Logging 이나 DB 접근에서 사용. (자주 호출되는 인스턴스가 필요한 경우 정의/사용)

 

ㅇ 장점

- 필요할 때 단일 인스턴스를 생성, 생성된 인스턴스는 메모리에 상주하며 다음 호출시 사용

 

ㅇ 주의

- 생성된 인스턴스는 메모리에 상주하고 있기 때문에 자원관리 필요

- 하나의 인스턴스 자원을 공유하므로 ripple effect 주의

 


 

ㅇ MariaDB 예제

더보기

- Singleton DB Class 정의

import mariadb

class MetaSingleton(type):
	_instances = {}

	def __call__(cls, *args, **kwds):
		if cls not in cls._instances:
			cls._instances[cls] = super(MetaSingleton, cls).__call__(*args, **kwds)
		return cls._instances[cls]
        
class MyDBManager(metaclass=MetaSingleton):
	_connection = None
	_cur = None
    
	def connect(self):
		try:
			if not self._connection:
				self._connection = mariadb.connect(
					user='root',
					password='mypasswd',
					host='127.0.0.1',
					port=3306,
					database='mydb')
				self._cur = self._connection.cursor()

			return self._cur
            
        except mariadb.Error as e:
            print(f'[ERR] Connecting to MariaDB : {e}')


	def createTable(self, table_name):
		# implements...
		pass


- Singleton 클래스 사용

from MyDBManager import MyDBManager

mdbm = MyDBManager()
dbcur = nbdm.connect()
dbcur.execute("SELECT * FROM mytable")

for data in dbcur:
    print(data)

 

- 한 번 선언된 이후에는 타-클래스에서 바로 사용 가능

from MyDBManager import MyDBManager

db_inst = MyDBManager().createTable("myTable")

 


ㅇ 참조

- https://refactoring.guru/design-patterns/singleton

- https://python.astrotech.io/design-patterns/creational/singleton.html

 

 

Comments