python设计模式

在 Python 中,设计模式是一种解决软件设计中常见问题的通用方法。设计模式并不是代码的具体实现,而是给出了一种结构或方法,帮助开发人员以最佳的方式解决问题。Python 中的设计模式与其他编程语言中的设计模式基本相同,但由于 Python 本身的特性(如动态类型、简洁的语法和强大的标准库),许多设计模式在 Python 中的实现会显得更简洁和灵活。

常见的设计模式可以分为三类:

  1. 创建型设计模式(Creational Patterns):关注对象的创建方式,避免硬编码创建逻辑。
  2. 结构型设计模式(Structural Patterns):关注类和对象的组合方式,如何将对象和类组织成更复杂的结构。
  3. 行为型设计模式(Behavioral Patterns):关注对象之间的交互与职责分配。

1. 创建型设计模式

创建型设计模式主要解决对象创建的问题,常见的设计模式包括:

单例模式(Singleton Pattern)

确保一个类只有一个实例,并提供全局访问点。

class Singleton:
    _instance = None

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

# 测试
s1 = Singleton()
s2 = Singleton()
print(s1 is s2)  # 输出 True,证明 s1 和 s2 是同一个实例

工厂方法模式(Factory Method Pattern)

通过工厂方法来创建对象,而不是直接调用构造函数。这样做可以更灵活地控制对象的创建。

class Animal:
    def speak(self):
        pass

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

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

class AnimalFactory:
    def create_animal(self, animal_type):
        if animal_type == 'dog':
            return Dog()
        elif animal_type == 'cat':
            return Cat()

# 测试
factory = AnimalFactory()
dog = factory.create_animal('dog')
cat = factory.create_animal('cat')
print(dog.speak())  # Woof!
print(cat.speak())  # Meow!

抽象工厂模式(Abstract Factory Pattern)

提供一个接口,用于创建一组相关或相互依赖的对象,而无需指定它们的具体类。

class Animal:
    def speak(self):
        pass

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

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

class AbstractFactory:
    def create_animal(self):
        pass

class DogFactory(AbstractFactory):
    def create_animal(self):
        return Dog()

class CatFactory(AbstractFactory):
    def create_animal(self):
        return Cat()

# 测试
dog_factory = DogFactory()
cat_factory = CatFactory()

dog = dog_factory.create_animal()
cat = cat_factory.create_animal()

print(dog.speak())  # Woof!
print(cat.speak())  # Meow!

2. 结构型设计模式

结构型设计模式主要关注如何组织和组合类与对象。常见的设计模式包括:

适配器模式(Adapter Pattern)

将一个类的接口转换成客户端希望的另一种接口,使得原本由于接口不兼容而无法一起工作的类可以一起工作。

class EuropeanSocketInterface:
    def voltage(self):
        return 230

class AmericanSocketInterface:
    def voltage(self):
        return 120

class Adapter(EuropeanSocketInterface):
    def __init__(self, american_socket):
        self.american_socket = american_socket

    def voltage(self):
        return self.american_socket.voltage()

# 测试
american_socket = AmericanSocketInterface()
adapter = Adapter(american_socket)
print(adapter.voltage())  # 输出 120

装饰器模式(Decorator Pattern)

动态地为对象添加额外的职责和功能,而不改变原始对象的代码。

class Coffee:
    def cost(self):
        return 5

class MilkDecorator:
    def __init__(self, coffee):
        self._coffee = coffee

    def cost(self):
        return self._coffee.cost() + 2

class SugarDecorator:
    def __init__(self, coffee):
        self._coffee = coffee

    def cost(self):
        return self._coffee.cost() + 1

# 测试
coffee = Coffee()
milk_coffee = MilkDecorator(coffee)
sugar_milk_coffee = SugarDecorator(milk_coffee)

print(coffee.cost())  # 输出 5
print(milk_coffee.cost())  # 输出 7
print(sugar_milk_coffee.cost())  # 输出 8

3. 行为型设计模式

行为型设计模式主要关注对象之间的交互和职责分配,常见的设计模式包括:

策略模式(Strategy Pattern)

定义一系列算法,将每个算法封装起来,并让它们可以互换。

class Strategy:
    def execute(self, a, b):
        pass

class AddStrategy(Strategy):
    def execute(self, a, b):
        return a + b

class SubtractStrategy(Strategy):
    def execute(self, a, b):
        return a - b

class Calculator:
    def __init__(self, strategy: Strategy):
        self._strategy = strategy

    def set_strategy(self, strategy: Strategy):
        self._strategy = strategy

    def calculate(self, a, b):
        return self._strategy.execute(a, b)

# 测试
calc = Calculator(AddStrategy())
print(calc.calculate(5, 3))  # 输出 8

calc.set_strategy(SubtractStrategy())
print(calc.calculate(5, 3))  # 输出 2

观察者模式(Observer Pattern)

定义对象间的一种一对多依赖关系,使得每当一个对象改变状态时,所有依赖于它的对象都会收到通知并自动更新。

class Subject:
    def __init__(self):
        self._observers = []

    def add_observer(self, observer):
        self._observers.append(observer)

    def notify_observers(self):
        for observer in self._observers:
            observer.update()

class Observer:
    def update(self):
        pass

class ConcreteObserver(Observer):
    def update(self):
        print("Observer updated!")

# 测试
subject = Subject()
observer1 = ConcreteObserver()
subject.add_observer(observer1)

subject.notify_observers()  # 输出 Observer updated!

总结

设计模式在 Python 中也具有重要作用,它们能够提高代码的灵活性、可复用性和可维护性。Python 的一些特性(如动态类型、内省、装饰器等)使得许多设计模式的实现比其他语言更加简洁和易于理解。在实际开发中,根据问题的复杂度选择合适的设计模式,可以帮助我们更好地组织代码,减少重复工作,提高开发效率。

posted @ 2025-02-19 15:02  清澈的澈  阅读(213)  评论(0)    收藏  举报