1. 单例模式(Singleton)
class AppConfig:
_instance = None
def __new__(cls):
if not cls._instance:
cls._instance = super().__new__(cls)
cls._instance.load_config()
return cls._instance
def load_config(self):
self.settings = {"theme": "dark", "language": "zh"}
# 使用
config1 = AppConfig()
config2 = AppConfig()
print(config1 is config2) # True
2. 工厂方法模式(Factory Method)
from abc import ABC, abstractmethod
class Payment(ABC):
@abstractmethod
def pay(self, amount): pass
class Alipay(Payment):
def pay(self, amount): print(f"支付宝支付:{amount}元")
class WechatPay(Payment):
def pay(self, amount): print(f"微信支付:{amount}元")
class PaymentFactory(ABC):
@abstractmethod
def create_payment(self): pass
class AlipayFactory(PaymentFactory):
def create_payment(self): return Alipay()
# 使用
factory = AlipayFactory()
payment = factory.create_payment()
payment.pay(100) # 支付宝支付:100元
3. 抽象工厂模式(Abstract Factory)
class LinuxButton:
def render(self): print("Linux风格按钮")
class MacButton:
def render(self): print("Mac风格按钮")
class GUIFactory(ABC):
@abstractmethod
def create_button(self): pass
class LinuxFactory(GUIFactory):
def create_button(self): return LinuxButton()
# 使用
factory = LinuxFactory()
button = factory.create_button()
button.render() # Linux风格按钮
4. 建造者模式(Builder)
class Pizza:
def __init__(self):
self.toppings = []
def add_topping(self, item):
self.toppings.append(item)
class PizzaBuilder:
def __init__(self):
self.pizza = Pizza()
def add_cheese(self):
self.pizza.add_topping("芝士")
return self
def add_pepperoni(self):
self.pizza.add_topping("意大利辣香肠")
return self
def build(self):
return self.pizza
# 使用
pizza = PizzaBuilder().add_cheese().add_pepperoni().build()
print(pizza.toppings) # ['芝士', '意大利辣香肠']
5. 原型模式(Prototype)
import copy
class Prototype:
def clone(self):
return copy.deepcopy(self)
class Car(Prototype):
def __init__(self, model):
self.model = model
# 使用
car1 = Car("Tesla Model S")
car2 = car1.clone()
print(car2.model) # Tesla Model S
6. 适配器模式(Adapter)
class OldSystem:
def legacy_output(self): return "旧系统数据"
class Adapter:
def __init__(self, old_system):
self.old_system = old_system
def new_output(self):
return f"适配后的数据:{self.old_system.legacy_output()}"
# 使用
adapter = Adapter(OldSystem())
print(adapter.new_output()) # 适配后的数据:旧系统数据
7. 装饰器模式(Decorator)
def log_decorator(func):
def wrapper(*args, **kwargs):
print(f"调用函数:{func.__name__}")
return func(*args, **kwargs)
return wrapper
@log_decorator
def calculate(a, b):
return a + b
print(calculate(2, 3)) # 输出:调用函数:calculate → 5
8. 代理模式(Proxy)
class RealImage:
def display(self): print("显示高清图片")
class ProxyImage:
def __init__(self):
self.real_image = None
def display(self):
if self.real_image is None:
self.real_image = RealImage()
self.real_image.display()
# 使用
proxy = ProxyImage()
proxy.display() # 显示高清图片(延迟加载)
9. 外观模式(Facade)
class CPU:
def start(self): print("CPU启动")
class Memory:
def load(self): print("内存加载")
class ComputerFacade:
def __init__(self):
self.cpu = CPU()
self.memory = Memory()
def start(self):
self.cpu.start()
self.memory.load()
# 使用
computer = ComputerFacade()
computer.start() # CPU启动 → 内存加载
10. 桥接模式(Bridge)
class Renderer(ABC):
@abstractmethod
def render_circle(self, radius): pass
class VectorRenderer(Renderer):
def render_circle(self, radius):
print(f"矢量渲染圆形,半径:{radius}")
class Shape:
def __init__(self, renderer):
self.renderer = renderer
def draw(self): pass
class Circle(Shape):
def __init__(self, renderer, radius):
super().__init__(renderer)
self.radius = radius
def draw(self):
self.renderer.render_circle(self.radius)
# 使用
vector_renderer = VectorRenderer()
circle = Circle(vector_renderer, 5)
circle.draw() # 矢量渲染圆形,半径:5
11. 组合模式(Composite)
class FileComponent(ABC):
@abstractmethod
def show(self): pass
class File(FileComponent):
def __init__(self, name):
self.name = name
def show(self): print(f"文件:{self.name}")
class Folder(FileComponent):
def __init__(self, name):
self.name = name
self.children = []
def add(self, component):
self.children.append(component)
def show(self):
print(f"文件夹:{self.name}")
for child in self.children:
child.show()
# 使用
root = Folder("根目录")
root.add(File("a.txt"))
sub_folder = Folder("子文件夹")
sub_folder.add(File("b.jpg"))
root.add(sub_folder)
root.show()
12. 享元模式(Flyweight)
class CharacterFactory:
_characters = {}
@classmethod
def get_character(cls, char):
if char not in cls._characters:
cls._characters[char] = Character(char)
return cls._characters[char]
class Character:
def __init__(self, char):
self.char = char
# 使用
char_a = CharacterFactory.get_character('A')
char_b = CharacterFactory.get_character('A')
print(char_a is char_b) # True(对象复用)
13. 观察者模式(Observer)
class NewsAgency:
def __init__(self):
self._subscribers = []
def subscribe(self, subscriber):
self._subscribers.append(subscriber)
def publish_news(self, news):
for sub in self._subscribers:
sub.update(news)
class Subscriber:
def update(self, news):
print(f"收到新闻:{news}")
# 使用
agency = NewsAgency()
agency.subscribe(Subscriber())
agency.publish_news("Breaking News!")
14. 策略模式(Strategy)
class SortStrategy(ABC):
@abstractmethod
def sort(self, data): pass
class QuickSort(SortStrategy):
def sort(self, data):
print("快速排序执行")
return sorted(data)
class Context:
def __init__(self, strategy):
self.strategy = strategy
def execute_sort(self, data):
return self.strategy.sort(data)
# 使用
context = Context(QuickSort())
context.execute_sort([3,1,2])
15. 责任链模式(Chain of Responsibility)
class Handler(ABC):
def __init__(self, successor=None):
self.successor = successor
@abstractmethod
def handle(self, request): pass
class ConcreteHandlerA(Handler):
def handle(self, request):
if request == "A":
print("HandlerA处理请求")
elif self.successor:
self.successor.handle(request)
class ConcreteHandlerB(Handler):
def handle(self, request):
if request == "B":
print("HandlerB处理请求")
elif self.successor:
self.successor.handle(request)
# 使用
chain = ConcreteHandlerA(ConcreteHandlerB())
chain.handle("B") # HandlerB处理请求
16. 命令模式(Command)
class Command(ABC):
@abstractmethod
def execute(self): pass
class LightOnCommand(Command):
def execute(self): print("开灯")
class RemoteControl:
def set_command(self, command):
self.command = command
def press_button(self):
self.command.execute()
# 使用
remote = RemoteControl()
remote.set_command(LightOnCommand())
remote.press_button() # 开灯
17. 迭代器模式(Iterator)
class BookCollection:
def __init__(self):
self.books = ["Python入门", "算法导论"]
def __iter__(self):
return iter(self.books)
# 使用
for book in BookCollection():
print(book) # 输出所有书名
18. 中介者模式(Mediator)
class ChatRoom:
@staticmethod
def send_message(user, message):
print(f"[{user}] 发送消息:{message}")
class User:
def __init__(self, name):
self.name = name
def send(self, message):
ChatRoom.send_message(self.name, message)
# 使用
user1 = User("Alice")
user1.send("你好!") # [Alice] 发送消息:你好!
19. 备忘录模式(Memento)
class EditorMemento:
def __init__(self, content):
self.content = content
class Editor:
def __init__(self):
self.content = ""
def write(self, text):
self.content += text
def save(self):
return EditorMemento(self.content)
def restore(self, memento):
self.content = memento.content
# 使用
editor = Editor()
editor.write("Hello")
saved = editor.save()
editor.write(" World")
editor.restore(saved)
print(editor.content) # Hello
20. 状态模式(State)
class OrderState(ABC):
@abstractmethod
def next_state(self): pass
class PaidState(OrderState):
def next_state(self):
print("订单已支付 → 发货")
return ShippedState()
class ShippedState(OrderState):
def next_state(self):
print("订单已发货 → 完成")
return CompletedState()
class Order:
def __init__(self):
self.state = PaidState()
def proceed(self):
self.state = self.state.next_state()
# 使用
order = Order()
order.proceed() # 订单已支付 → 发货
order.proceed() # 订单已发货 → 完成
21. 访问者模式(Visitor)
class DocumentElement(ABC):
@abstractmethod
def accept(self, visitor): pass
class TextElement(DocumentElement):
def accept(self, visitor):
visitor.visit_text(self)
class Visitor(ABC):
@abstractmethod
def visit_text(self, element): pass
class HTMLExportVisitor(Visitor):
def visit_text(self, element):
print("将文本导出为HTML")
# 使用
elements = [TextElement()]
visitor = HTMLExportVisitor()
for elem in elements:
elem.accept(visitor)
22. 模板方法模式(Template Method)
from abc import ABC, abstractmethod
class DatabaseTemplate(ABC):
def execute(self):
self.connect()
self.query()
self.close()
@abstractmethod
def connect(self): pass
@abstractmethod
def query(self): pass
def close(self): print("关闭连接")
class MySQL(DatabaseTemplate):
def connect(self): print("连接MySQL")
def query(self): print("执行查询")
# 使用
db = MySQL()
db.execute() # 连接MySQL → 执行查询 → 关闭连接
23. 解释器模式(Interpreter)
class Context:
def __init__(self):
self.variables = {}
class BooleanExpression(ABC):
@abstractmethod
def evaluate(self, context): pass
class Variable(BooleanExpression):
def __init__(self, name):
self.name = name
def evaluate(self, context):
return context.variables[self.name]
# 使用
context = Context()
context.variables["x"] = True
expr = Variable("x")
print(expr.evaluate(context)) # True
本文完整实现了23种设计模式的Python代码示例,覆盖创建型、结构型、行为型三大类别。设计模式本质是代码设计经验的总结,使用时需注意:
建议收藏本文作为开发参考手册,实际编码时根据具体需求灵活选用。