Python 常用设计模式

class 设计模式

设计模式是一种软件设计中常用的解决方案,能够帮助开发者写出更高效、可维护的代码。以下是 Python 中常用的几种设计模式:单例模式、工厂模式、观察者模式等的详细介绍与示例讲解。

1. 单例模式 (Singleton Pattern)

概念: 单例模式保证一个类只有一个实例,并提供一个访问它的全局访问点。这在需要共享资源、控制实例数或提供全局配置时非常有用。

实现方式:

  • 懒汉式: 只有在需要实例时才创建。
  • 饿汉式: 程序一启动就创建实例。

示例:

class Singleton:
    _instance = None

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

# 使用单例类
s1 = Singleton()
s2 = Singleton()

print(s1 is s2)  # 输出: True,说明s1和s2是同一个实例

2. 工厂模式 (Factory Pattern)

概念: 工厂模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法使得类的实例化推迟到子类。

类型:

  • 简单工厂模式: 由一个工厂类根据传入的参数来决定创建哪种具体产品类的实例。
  • 工厂方法模式: 通过继承,将对象的创建交给子类实现。
  • 抽象工厂模式: 提供创建一系列相关或依赖对象的接口,而无需指定它们的具体类。

示例(简单工厂模式):

class Shape:
    def draw(self):
        raise NotImplementedError("This method should be overridden.")

class Circle(Shape):
    def draw(self):
        return "Drawing a Circle"

class Square(Shape):
    def draw(self):
        return "Drawing a Square"

class ShapeFactory:
    @staticmethod
    def create_shape(shape_type):
        if shape_type == "circle":
            return Circle()
        elif shape_type == "square":
            return Square()
        else:
            return None

# 使用工厂模式创建对象
factory = ShapeFactory()
shape1 = factory.create_shape("circle")
shape2 = factory.create_shape("square")

print(shape1.draw())  # 输出: Drawing a Circle
print(shape2.draw())  # 输出: Drawing a Square

3. 观察者模式 (Observer Pattern)

概念: 观察者模式定义了对象之间的一对多依赖关系,使得当一个对象状态发生改变时,其依赖者(观察者)能够得到通知并自动更新。这通常用于事件驱动系统或模型-视图-控制器 (MVC) 中。

示例:

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

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

    def detach(self, observer):
        self._observers.remove(observer)

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

class Observer:
    def update(self):
        raise NotImplementedError("This method should be overridden.")

class ConcreteObserver(Observer):
    def __init__(self, name):
        self.name = name

    def update(self):
        print(f"{self.name} received an update!")

# 使用观察者模式
subject = Subject()

observer1 = ConcreteObserver("Observer 1")
observer2 = ConcreteObserver("Observer 2")

subject.attach(observer1)
subject.attach(observer2)

subject.notify()

输出:

Observer 1 received an update!
Observer 2 received an update!

4. 策略模式 (Strategy Pattern)

概念: 策略模式定义了算法族,分别封装起来,使它们可以互相替换。策略模式使得算法的变化独立于使用算法的客户。

示例:

class Strategy:
    def execute(self, data):
        raise NotImplementedError("This method should be overridden.")

class ConcreteStrategyA(Strategy):
    def execute(self, data):
        return f"Strategy A processing {data}"

class ConcreteStrategyB(Strategy):
    def execute(self, data):
        return f"Strategy B processing {data}"

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

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

    def execute_strategy(self, data):
        return self._strategy.execute(data)

# 使用策略模式
context = Context(ConcreteStrategyA())
print(context.execute_strategy("data"))  # 输出: Strategy A processing data

context.set_strategy(ConcreteStrategyB())
print(context.execute_strategy("data"))  # 输出: Strategy B processing data

5. 代理模式 (Proxy Pattern)

概念: 代理模式为其他对象提供一种代理以控制对这个对象的访问。通常用于控制访问权限或延迟加载资源。

示例:

class RealSubject:
    def request(self):
        return "Real Subject Request"

class Proxy:
    def __init__(self):
        self._real_subject = RealSubject()

    def request(self):
        print("Proxy handling the request...")
        return self._real_subject.request()

# 使用代理模式
proxy = Proxy()
print(proxy.request())  # 输出: Proxy handling the request... Real Subject Request

6. 装饰器模式 (Decorator Pattern)

概念: 装饰器模式允许向现有对象添加新的功能,而不改变其结构。它是一种用于对象行为的动态扩展。

示例:

class Component:
    def operation(self):
        raise NotImplementedError("This method should be overridden.")

class ConcreteComponent(Component):
    def operation(self):
        return "Concrete Component"

class Decorator(Component):
    def __init__(self, component: Component):
        self._component = component

    def operation(self):
        return self._component.operation()

class ConcreteDecoratorA(Decorator):
    def operation(self):
        return f"Decorator A({self._component.operation()})"

class ConcreteDecoratorB(Decorator):
    def operation(self):
        return f"Decorator B({self._component.operation()})"

# 使用装饰器模式
component = ConcreteComponent()
decorator_a = ConcreteDecoratorA(component)
decorator_b = ConcreteDecoratorB(decorator_a)

print(decorator_b.operation())  # 输出: Decorator B(Decorator A(Concrete Component))

7. 适配器模式 (Adapter Pattern)

概念: 适配器模式将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。

示例:

class Target:
    def request(self):
        return "Target's behavior"

class Adaptee:
    def specific_request(self):
        return "Adaptee's behavior"

class Adapter(Target):
    def __init__(self, adaptee: Adaptee):
        self._adaptee = adaptee

    def request(self):
        return f"Adapter({self._adaptee.specific_request()})"

# 使用适配器模式
adaptee = Adaptee()
adapter = Adapter(adaptee)

print(adapter.request())  # 输出: Adapter(Adaptee's behavior)

8. 外观模式 (Facade Pattern)

概念: 外观模式为子系统中的一组接口提供了一个统一的接口。外观定义了一个高层接口,使得子系统更容易使用。

示例:

class SubsystemA:
    def operation_a(self):
        return "Subsystem A operation"

class SubsystemB:
    def operation_b(self):
        return "Subsystem B operation"

class Facade:
    def __init__(self):
        self._subsystem_a = SubsystemA()
        self._subsystem_b = SubsystemB()

    def operation(self):
        result = []
        result.append(self._subsystem_a.operation_a())
        result.append(self._subsystem_b.operation_b())
        return "\n".join(result)

# 使用外观模式
facade = Facade()
print(facade.operation())

输出:

Subsystem A operation
Subsystem B operation

9. 模板方法模式 (Template Method Pattern)

概念: 模板方法模式定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变算法结构即可重定义该算法的某些步骤。

示例:

class AbstractClass:
    def template_method(self):
        self.base_operation()
        self.required_operations1()
        self.required_operations2()

    def base_operation(self):
        print("Base operation")

    def required_operations1(self):
        raise NotImplementedError("This method should be overridden.")

    def required_operations2(self):
        raise NotImplementedError("This method should be overridden.")

class ConcreteClassA(AbstractClass):
    def required_operations1(self):
        print("ConcreteClassA operation1")

    def required_operations2(self):
        print("ConcreteClassA operation2")

# 使用模板方法模式
concrete_class = ConcreteClassA()


concrete_class.template_method()

输出:

Base operation
ConcreteClassA operation1
ConcreteClassA operation2

10. 享元模式 (Flyweight Pattern)

概念: 享元模式通过共享技术来支持大量细粒度对象的高效共享。它减少了内存的使用,并提高了性能。

示例:

class Flyweight:
    def __init__(self, intrinsic_state):
        self.intrinsic_state = intrinsic_state

    def operation(self, extrinsic_state):
        return f"Intrinsic: {self.intrinsic_state}, Extrinsic: {extrinsic_state}"

class FlyweightFactory:
    _flyweights = {}

    @classmethod
    def get_flyweight(cls, intrinsic_state):
        if intrinsic_state not in cls._flyweights:
            cls._flyweights[intrinsic_state] = Flyweight(intrinsic_state)
        return cls._flyweights[intrinsic_state]

# 使用享元模式
factory = FlyweightFactory()

flyweight1 = factory.get_flyweight("State1")
flyweight2 = factory.get_flyweight("State2")
flyweight3 = factory.get_flyweight("State1")  # 复用之前创建的对象

print(flyweight1.operation("Extrinsic1"))
print(flyweight2.operation("Extrinsic2"))
print(flyweight3.operation("Extrinsic3"))

输出:

Intrinsic: State1, Extrinsic: Extrinsic1
Intrinsic: State2, Extrinsic: Extrinsic2
Intrinsic: State1, Extrinsic: Extrinsic3

以上是 Python 中常用的几种设计模式的介绍与示例。设计模式有助于解决软件开发中的常见问题,使代码更加模块化、可复用和易于维护。在实际项目中,根据需求选择合适的设计模式,可以显著提高代码质量。

评论区
评论列表
menu