设计模式在软件开发中非常重要,尤其是在面试中经常被问到。以下是一些常见的设计模式,以及它们的应用案例:
模式 | 作用 | 案例 |
---|---|---|
单例模式 | 确保只有一个实例 | 日志管理、数据库连接池 |
工厂模式 | 让子类决定实例化 | 解析不同格式的文件(JSON、XML) |
适配器模式 | 兼容不同接口 | 旧系统迁移、新 API 适配 |
代理模式 | 控制访问 | 权限控制、远程调用 |
观察者模式 | 事件触发 | 订阅/发布、GUI 事件 |
策略模式 | 动态切换算法 | 支付方式、游戏 AI |
作用:保证某个类只有一个实例,并提供一个全局访问点。
class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
# 测试
obj1 = Singleton()
obj2 = Singleton()
print(obj1 is obj2) # True,两个对象是同一个
作用:定义一个接口,让子类决定实例化哪一个类,解耦对象创建过程。
new
,提高扩展性class Animal:
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "汪汪!"
class Cat(Animal):
def speak(self):
return "喵喵!"
class AnimalFactory:
@staticmethod
def get_animal(animal_type):
if animal_type == "dog":
return Dog()
elif animal_type == "cat":
return Cat()
else:
raise ValueError("未知动物类型")
# 测试
animal = AnimalFactory.get_animal("dog")
print(animal.speak()) # "汪汪!"
作用:通过克隆(复制)已有对象来创建新对象,减少 new
操作的开销。
import copy
class Prototype:
def clone(self):
return copy.deepcopy(self)
class Car(Prototype):
def __init__(self, brand, model):
self.brand = brand
self.model = model
# 复制对象
car1 = Car("Tesla", "Model S")
car2 = car1.clone()
print(car1 is car2) # False,不是同一个对象
print(car2.brand) # "Tesla"
作用:把一个类的接口转换成另一个接口,让不兼容的类可以一起工作。
class OldSystem:
def old_method(self):
return "老系统方法"
class Adapter:
def __init__(self, old_system):
self.old_system = old_system
def new_method(self):
return self.old_system.old_method()
# 适配
old_sys = OldSystem()
adapter = Adapter(old_sys)
print(adapter.new_method()) # "老系统方法"
作用:控制对象的访问,在访问目标对象前后进行额外操作(如权限控制、缓存)。
class RealObject:
def request(self):
return "真实对象的请求"
class Proxy:
def __init__(self):
self.real_object = RealObject()
def request(self):
print("代理:检查权限...")
return self.real_object.request()
# 使用代理
proxy = Proxy()
print(proxy.request()) # "代理:检查权限... 真实对象的请求"
作用:当一个对象的状态发生变化,所有依赖它的对象都会收到通知。
class Observer:
def update(self, message):
pass
class User(Observer):
def __init__(self, name):
self.name = name
def update(self, message):
print(f"{self.name} 收到消息: {message}")
class Subject:
def __init__(self):
self.observers = []
def add_observer(self, observer):
self.observers.append(observer)
def notify(self, message):
for observer in self.observers:
observer.update(message)
# 测试
subject = Subject()
user1 = User("Alice")
user2 = User("Bob")
subject.add_observer(user1)
subject.add_observer(user2)
subject.notify("Python 设计模式更新!")
作用:定义一系列策略(算法),并且可以动态切换。
class PaymentStrategy:
def pay(self, amount):
pass
class Alipay(PaymentStrategy):
def pay(self, amount):
return f"使用支付宝支付 {amount} 元"
class WeChatPay(PaymentStrategy):
def pay(self, amount):
return f"使用微信支付 {amount} 元"
class PaymentContext:
def __init__(self, strategy):
self.strategy = strategy
def execute_payment(self, amount):
return self.strategy.pay(amount)
# 选择支付方式
context = PaymentContext(WeChatPay())
print(context.execute_payment(100)) # "使用微信支付 100 元"
模式 | 作用 | 案例 |
---|---|---|
单例模式 | 确保只有一个实例 | 日志管理、数据库连接池 |
工厂模式 | 让子类决定实例化 | 解析不同格式的文件(JSON、XML) |
适配器模式 | 兼容不同接口 | 旧系统迁移、新 API 适配 |
代理模式 | 控制访问 | 权限控制、远程调用 |
观察者模式 | 事件触发 | 订阅/发布、GUI 事件 |
策略模式 | 动态切换算法 | 支付方式、游戏 AI |
面试技巧