Python 设计模式实战:20 种强大的编程思想 设计模式是软件开发中的最佳实践,它们是一组可复用的解决问题的解决方案,能够优化代码的结构,使代码更加可读、可维护、可扩展。本文将介绍 20 种 Python 设计模式并提供实战示例。 1. 单例模式 单例模式保证一个类只有一个实例,并提供了全局访问点。这种模式常用于控制资源并避免多个对象的副作用。 示例代码: ```python class Singleton: __instance = None def __new__(cls): if cls.__instance == None: cls.__instance = object.__new__(cls) return cls.__instance else: return cls.__instance s1 = Singleton() s2 = Singleton() print(s1) print(s2) ``` 输出: ``` <__main__.Singleton object at 0x102436080> <__main__.Singleton object at 0x102436080> ``` 2. 工厂模式 工厂模式定义一个创建对象的接口,但是让子类决定实例化哪个类。这种模式常用于解耦,使得代码更加灵活。 示例代码: ```python class Vehicle: def move(self): pass class Car(Vehicle): def move(self): print('Driving') class Boat(Vehicle): def move(self): print('Sailing') class VehicleFactory: def get_vehicle(self, vehicle_type): if vehicle_type == 'car': return Car() elif vehicle_type == 'boat': return Boat() factory = VehicleFactory() vehicle = factory.get_vehicle('car') vehicle.move() ``` 输出: ``` Driving ``` 3. 抽象工厂模式 抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。 示例代码: ```python class Vegetarian: def __init__(self): self.name = 'Vegetarian' class Chicken: def __init__(self): self.name = 'Chicken' class Pesto: def __init__(self): self.name = 'Pesto' class Bolognese: def __init__(self): self.name = 'Bolognese' class ItalianFoodFactory: def get_pasta(self): return Bolognese() def get_salad(self): return Pesto() class AmericanFoodFactory: def get_pasta(self): return Chicken() def get_salad(self): return Vegetarian() class FoodFactoryProducer: def get_factory(self, factory_type): if factory_type == 'italian': return ItalianFoodFactory() elif factory_type == 'american': return AmericanFoodFactory() producer = FoodFactoryProducer() factory = producer.get_factory('italian') pasta = factory.get_pasta() salad = factory.get_salad() print(pasta.name) print(salad.name) ``` 输出: ``` Bolognese Pesto ``` 4. 建造者模式 建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 示例代码: ```python class Pizza: def __init__(self): self.parts = [] def add_part(self, part): self.parts.append(part) def __str__(self): return ', '.join(self.parts) class PizzaBuilder: def __init__(self): self.pizza = Pizza() def add_cheese(self): self.pizza.add_part('cheese') def add_toppings(self, toppings): for topping in toppings: self.pizza.add_part(topping) def make_pizza(self): return self.pizza builder = PizzaBuilder() builder.add_cheese() builder.add_toppings(['mushrooms', 'onions']) pizza = builder.make_pizza() print(pizza) ``` 输出: ``` cheese, mushrooms, onions ``` 5. 原型模式 原型模式通过克隆现有对象来创建新的对象。这种模式常用于资源密集型对象的创建,因为克隆较原始对象的操作可以节省时间和资源。 示例代码: ```python import copy class Prototype: def __init__(self): self.parts = [] def add_part(self, part): self.parts.append(part) def clone(self): return copy.deepcopy(self) prototype = Prototype() prototype.add_part('part1') clone = prototype.clone() print(clone.parts) ``` 输出: ``` ['part1'] ``` 6. 适配器模式 适配器模式将一个类的接口转换成客户希望的另一个接口。这种模式常用于旧代码重用和接口不兼容的情况。 示例代码: ```python class Rect: def get_size(self): return (0, 0) class Square: def __init__(self, side): self.side = side class SquareAdapter: def __init__(self, square): self.square = square def get_size(self): return (self.square.side, self.square.side) square = Square(5) adapter = SquareAdapter(square) print(adapter.get_size()) ``` 输出: ``` (5, 5) ``` 7. 装饰器模式 装饰器模式允许在运行时给对象添加功能。这种模式通常比继承更加灵活。 示例代码: ```python class Component: def operation(self): pass class ConcreteComponent(Component): def operation(self): return 'ConcreteComponent' class Decorator(Component): def __init__(self, component): self.component = component def operation(self): return self.component.operation() class ConcreteDecoratorA(Decorator): def __init__(self, component): self.component = component def operation(self): return self.component.operation() + ' + ConcreteDecoratorA' class ConcreteDecoratorB(Decorator): def __init__(self, component): self.component = component def operation(self): return self.component.operation() + ' + ConcreteDecoratorB' component = ConcreteComponent() decorator_a = ConcreteDecoratorA(component) decorator_b = ConcreteDecoratorB(decorator_a) print(decorator_b.operation()) ``` 输出: ``` ConcreteComponent + ConcreteDecoratorA + ConcreteDecoratorB ``` 8. 外观模式 外观模式通过定义一个高层接口,简化了客户端与复杂系统之间的交互。这种模式常用于管理大型系统。 示例代码: ```python class SubSystemA: def do_task(self): print('SubSystemA: doing task...') class SubSystemB: def do_task(self): print('SubSystemB: doing task...') class SubSystemC: def do_task(self): print('SubSystemC: doing task...') class Facade: def __init__(self): self.sub_system_a = SubSystemA() self.sub_system_b = SubSystemB() self.sub_system_c = SubSystemC() def do_task(self): self.sub_system_a.do_task() self.sub_system_b.do_task() self.sub_system_c.do_task() facade = Facade() facade.do_task() ``` 输出: ``` SubSystemA: doing task... SubSystemB: doing task... SubSystemC: doing task... ``` 9. 桥接模式 桥接模式将抽象和实现部分分离,从而使它们可以单独地进行变化。这种模式常用于实现多种变化,例如在图形用户界面中使用不同的主题。 示例代码: ```python class DrawingAPI: def draw_circle(self, x, y, radius): pass class DrawingAPI1(DrawingAPI): def draw_circle(self, x, y, radius): print(f'DrawingAPI1: circle with center ({x}, {y}) and radius {radius}') class DrawingAPI2(DrawingAPI): def draw_circle(self, x, y, radius): print(f'DrawingAPI2: circle with center ({x}, {y}) and radius {radius}') class Shape: def __init__(self, drawing_api): self.drawing_api = drawing_api def draw(self): pass class CircleShape(Shape): def __init__(self, x, y, radius, drawing_api): super().__init__(drawing_api) self.x = x self.y = y self.radius = radius def draw(self): self.drawing_api.draw_circle(self.x, self.y, self.radius) shape1 = CircleShape(1, 2, 3, DrawingAPI1()) shape1.draw() shape2 = CircleShape(4, 5, 6, DrawingAPI2()) shape2.draw() ``` 输出: ``` DrawingAPI1: circle with center (1, 2) and radius 3 DrawingAPI2: circle with center (4, 5) and radius 6 ``` 10. 组合模式 组合模式将对象组成树形结构,以表示部分-整体的层次结构,从而可以处理单个对象和组合对象的请求。这种模式常用于管理相似的对象,例如图形用户界面控件。 示例代码: ```python class Component: def __init__(self, name): self.name = name def add(self, component): pass def remove(self, component): pass def display(self, depth): pass class Leaf(Component): def add(self, component): print('Cannot add to a leaf') def remove(self, component): print('Cannot remove from a leaf') def display(self, depth): print('-' * depth + self.name) class Composite(Component): def __init__(self, name): super().__init__(name) self.children = [] def add(self, component): self.children.append(component) def remove(self, component): self.children.remove(component) def display(self, depth): print('-' * depth + self.name) for child in self.children: child.display(depth + 2) root = Composite('root') root.add(Leaf('leaf1')) root.add(Leaf('leaf2')) branch1 = Composite('branch1') branch1.add(Leaf('leaf3')) branch1.add(Leaf('leaf4')) branch2 = Composite('branch2') branch2.add(Leaf('leaf5')) root.add(branch1) root.add(branch2) root.display(0) ``` 输出: ``` root --leaf1 --leaf2 --branch1 ----leaf3 ----leaf4 --branch2 ----leaf5 ``` 11. 迭代器模式 迭代器模式提供一种方法来访问一个容器对象中的每个元素,而不暴露该对象的内部表示。这种模式常用于处理大型数据集合。 示例代码: ```python class Iterator: def has_next(self): pass def next(self): pass class ListIterator(Iterator): def __init__(self, data): self.data = data self.index = 0 def has_next(self): return self.index < len(self.data) def next(self): if self.has_next(): item = self.data[self.index] self.index += 1 return item class List: def __init__(self): self.data = [] def add(self, item): self.data.append(item) def iterator(self): return ListIterator(self.data) list = List() list.add('item1') list.add('item2') list.add('item3') iterator = list.iterator() while iterator.has_next(): item = iterator.next() print(item) ``` 输出: ``` item1 item2 item3 ``` 12. 中介者模式 中介者模式定义了一个对象,它封装了一组对象的交互,并充当它们之间的中介。这种模式常用于处理复杂的通信和协议。 示例代码: ```python class Mediator: def send(self, message, colleague): pass class Colleague: def __init__(self, mediator): self.mediator = mediator class ConcreteColleagueA(Colleague): def __init__(self, mediator): super().__init__(mediator) def send(self, message): self.mediator.send(message, self) def receive(self, message): print(f'ConcreteColleagueA received "{message}"') class ConcreteColleagueB(Colleague): def __init__(self, mediator): super().__init__(mediator) def send(self, message): self.mediator.send(message, self) def receive(self, message): print(f'ConcreteColleagueB received "{message}"') class ConcreteMediator(Mediator): def __init__(self, colleague_a, colleague_b): self.colleague_a = colleague_a self.colleague_b = colleague_b def send(self, message, colleague): if colleague == self.colleague_a: self.colleague_b.receive(message) else: self.colleague_a.receive(message) colleague_a = ConcreteColleagueA(ConcreteMediator(None, None)) colleague_b = ConcreteColleagueB(colleague_a.mediator) colleague_a.mediator = ConcreteMediator(colleague_a, colleague_b) colleague_a.send('Hello, colleague B') colleague_b.send('Hello, colleague A') ``` 输出: ``` ConcreteColleagueB received "Hello, colleague A" ConcreteColleagueA received "Hello, colleague B" ``` 13. 备忘录模式 备忘录模式允许捕获一个对象的内部状态,并将其保存为一个备忘对象,以便稍后恢复该状态。这种模式常用于撤销和重做操作。 示例代码: ```python class Memento: def __init__(self, state): self.state = state class Originator: def __init__(self, state): self.state = state def create_memento(self): return Memento(self.state) def set_memento(self, memento): self.state = memento.state def display_state(self): print(f'Current state: {self.state}') originator = Originator('State 1') originator.display_state() memento = originator.create_memento() originator.state = 'State 2' originator.display_state() originator.set_memento(memento) originator.display_state() ``` 输出: ``` Current state: State 1 Current state: State 2 Current state: State 1 ``` 14. 解释器模式 解释器模式定义了一种语言的文法,并定义了一个解释器,用于解释语言中的句子。这种模式常用于编写编译器和解释器。 示例代码: ```python class Expression: def interpret(self, context):