ToolkitX
知识库工具箱

设计模式

单例、工厂、观察者、策略模式

30min·进阶

01. 创建型模式

创建型模式关注对象的创建机制,试图以适合情况的方式创建对象。 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。应用场景:数据库连接池、日志记录器、配置管理器。 工厂模式(Factory):定义创建对象的接口,让子类决定实例化哪个类。应用场景:根据配置创建不同类型的对象。
python
# 单例模式
class Singleton:
_instance = None

def __new__(cls):
    if cls._instance is None:
        cls._instance = super().__new__(cls)
        cls._instance._initialized = False
    return cls._instance

def __init__(self):
    if self._initialized:
        return
    self._initialized = True
    self.connection = "数据库连接已建立"

# 工厂模式
class Animal:
def speak(self):
    pass

class Dog(Animal):
def speak(self):
    return "汪汪!"

class Cat(Animal):
def speak(self):
    return "喵喵!"

class AnimalFactory:
@staticmethod
def create_animal(animal_type):
    if animal_type == "dog":
        return Dog()
    elif animal_type == "cat":
        return Cat()
    raise ValueError(f"未知动物类型: {animal_type}")

# 使用
dog = AnimalFactory.create_animal("dog")
print(dog.speak())  # 汪汪!

02. 行为型模式

行为型模式关注对象之间的通信和职责分配。 观察者模式(Observer):定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都会收到通知。应用场景:事件系统、消息订阅、数据绑定。 策略模式(Strategy):定义一系列算法,将每个算法封装起来,使它们可以互换。应用场景:排序算法切换、支付方式选择、验证规则。
python
# 观察者模式
class EventEmitter:
def __init__(self):
    self._listeners = {}

def on(self, event, callback):
    if event not in self._listeners:
        self._listeners[event] = []
    self._listeners[event].append(callback)

def emit(self, event, *args):
    if event in self._listeners:
        for callback in self._listeners[event]:
            callback(*args)

# 使用
emitter = EventEmitter()
emitter.on("data", lambda data: print(f"收到数据: {data}"))
emitter.on("data", lambda data: print(f"处理数据: {data.upper()}"))
emitter.emit("data", "hello world")

# 策略模式
class SortStrategy:
def sort(self, data):
    pass

class BubbleSort(SortStrategy):
def sort(self, data):
    arr = data.copy()
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr

class QuickSort(SortStrategy):
def sort(self, data):
    if len(data) <= 1:
        return data
    pivot = data[len(data) // 2]
    left = [x for x in data if x < pivot]
    middle = [x for x in data if x == pivot]
    right = [x for x in data if x > pivot]
    return self.sort(left) + middle + self.sort(right)

class Sorter:
def __init__(self, strategy: SortStrategy):
    self._strategy = strategy

def sort(self, data):
    return self._strategy.sort(data)

sorter = Sorter(BubbleSort())
print(sorter.sort([3, 1, 4, 1, 5, 9, 2, 6]))

知识测验

1/5正确 0

单例模式的目的是什么?

下一节

正则表达式深入

下一节