Одиночка - это паттерн, который гарантирует, что у калсса есть только один экземпляр и предоставляет глобальную точку доступа к этому экземпляру.

Стоит использовать когда в программе должен быть единственный экземпляр класс, доступный всем, или когда нужно более строго управление глобальными переменными или для централизованного управления ресурсами.

Используется в логировании, подключении к БД, конфигурации и в кешировании.

В отличие от Фабричного метода, Прототипа и Строителя, Одиночка контролирует и запрещает создание новых сложных объектов.

Можно реализовать через классическую реализацию (переопределение new), через метакласс и через декоратор. Пример через метакласс: `class SingletonMeta(type): _instances = {}

def call(cls, args, **kwargs): if cls not in cls._instances: instance = super().call(args, **kwargs) cls.instances[cls] = instance return cls.instances[cls]

class DatabaseConnection(metaclass=SingletonMeta): def init(self): self.connection = "Active DB Connection"

def query(self, sql): return f"Выполнен запрос: {sql}"

#Использование

if name == "main": db1 = DatabaseConnection() db2 = DatabaseConnection()

print(db1.query("SELECT * FROM users")) print(db2.query("SELECT * FROM orders"))

print(db1 is db2) # True И пример через new `class Singleton: _instance = None

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

def init(self): self.value = None

def some_business_logic(self):

#Пример бизнес-логики

pass

#Использование

if name == "main": s1 = Singleton() s2 = Singleton()

print(id(s1) == id(s2)) # True - это один и тот же объект

s1.value = "Hello" print(s2.value) # Выведет "Hello" #weekofpatterns``