8 min read
ā¢Question 37 of 41hardDesign Patterns in Python
Common design patterns implementation.
Design Patterns
Singleton
code.pyPython
class Singleton:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
# Or using decorator
def singleton(cls):
instances = {}
def get_instance(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return get_instance
@singleton
class Database:
passFactory
code.pyPython
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def speak(self) -> str:
pass
class Dog(Animal):
def speak(self) -> str:
return "Woof!"
class Cat(Animal):
def speak(self) -> str:
return "Meow!"
class AnimalFactory:
@staticmethod
def create(animal_type: str) -> Animal:
if animal_type == "dog":
return Dog()
elif animal_type == "cat":
return Cat()
raise ValueError(f"Unknown: {animal_type}")
animal = AnimalFactory.create("dog")Observer
code.pyPython
from abc import ABC, abstractmethod
class Observer(ABC):
@abstractmethod
def update(self, message: str):
pass
class Subject:
def __init__(self):
self._observers: list[Observer] = []
def attach(self, observer: Observer):
self._observers.append(observer)
def notify(self, message: str):
for observer in self._observers:
observer.update(message)
class EmailNotifier(Observer):
def update(self, message: str):
print(f"Email: {message}")
subject = Subject()
subject.attach(EmailNotifier())
subject.notify("Hello!")Strategy
code.pyPython
from abc import ABC, abstractmethod
class SortStrategy(ABC):
@abstractmethod
def sort(self, data: list) -> list:
pass
class QuickSort(SortStrategy):
def sort(self, data: list) -> list:
return sorted(data) # Simplified
class BubbleSort(SortStrategy):
def sort(self, data: list) -> list:
# Bubble sort implementation
return sorted(data)
class Sorter:
def __init__(self, strategy: SortStrategy):
self.strategy = strategy
def sort(self, data: list) -> list:
return self.strategy.sort(data)
sorter = Sorter(QuickSort())
result = sorter.sort([3, 1, 4, 1, 5])