目录
- 原型模式简介
- 原型模式的结构
- 原型模式的优缺点
- 原型模式的实现
- 4.1 浅拷贝 vs 深拷贝
- 4.2 Python 原型模式示例
- 原型模式的应用场景
- 出站链接
- 站内链接
- 参考资料
1. 原型模式简介
原型模式(Prototype Pattern) 是一种创建型设计模式,用于通过克隆已有对象来创建新对象,而不是直接实例化新的对象。
为什么使用原型模式?
- 提升性能:避免重复创建对象,提高对象创建的效率。
- 减少耦合:客户端代码无需依赖具体的构造方法。
- 支持动态对象结构:在运行时可以修改对象,并创建相同配置的新对象。
典型应用
- 游戏角色复制(复制已有角色并调整装备)
- 文档模板(克隆已有文档并修改内容)
- 网络请求(克隆请求对象并修改参数)
2. 原型模式的结构
原型模式主要包含以下两个核心角色:
角色 | 作用 |
---|---|
Prototype(原型接口) | 定义 clone() 方法,允许克隆自身 |
ConcretePrototype(具体原型) | 实现 clone() 方法,执行复制操作 |
UML 类图
┌────────────────────┐
│ Prototype │ (原型接口)
│ + clone() │
└────────▲─────────┘
│
┌────────────────────┐
│ ConcretePrototype │ (具体原型)
│ + clone() │
└────────────────────┘
3. 原型模式的优缺点
✅ 优点
- 提高对象创建效率,避免重复构造相似对象。
- 降低耦合,无需依赖类的构造方法。
- 可以在运行时动态调整对象,然后克隆多个相同结构的对象。
❌ 缺点
- 深拷贝较复杂,涉及嵌套对象时,可能需要递归克隆。
- 不适合过于简单的对象,普通构造方法更直观。
4. 原型模式的实现
4.1 浅拷贝 vs 深拷贝
在 Python 中,复制对象时有 两种方式:
- 浅拷贝(shallow copy):
- 复制对象的 基本数据类型(如
int
、str
)。 - 共享 引用类型对象(如
list
、dict
)。
- 复制对象的 基本数据类型(如
- 深拷贝(deep copy):
- 递归复制所有对象,包括嵌套对象,保证独立副本。
import copy
original_list = [[1, 2, 3], 4, 5]
# 浅拷贝
shallow_copy = copy.copy(original_list)
shallow_copy[0].append(6) # 修改原列表的嵌套列表
# 深拷贝
deep_copy = copy.deepcopy(original_list)
deep_copy[0].append(7) # 仅修改深拷贝的列表
print(original_list) # [[1, 2, 3, 6], 4, 5]
print(shallow_copy) # [[1, 2, 3, 6], 4, 5]
print(deep_copy) # [[1, 2, 3, 6, 7], 4, 5]
4.2 Python 原型模式示例
场景:创建一个汽车对象,然后克隆它以创建不同颜色的汽车。
import copy
# 1. 原型接口
class Prototype:
def clone(self):
return copy.deepcopy(self)
# 2. 具体原型
class Car(Prototype):
def __init__(self, model, color, features):
self.model = model
self.color = color
self.features = features # 复杂对象(字典)
def __str__(self):
return f"Car(Model: {self.model}, Color: {self.color}, Features: {self.features})"
# 3. 客户端代码
car1 = Car("Tesla Model S", "Red", {"Autopilot": True, "Sunroof": False})
car2 = car1.clone() # 复制对象
car2.color = "Blue" # 修改克隆对象的属性
car2.features["Sunroof"] = True # 修改嵌套对象
print(car1) # Car(Model: Tesla Model S, Color: Red, Features: {'Autopilot': True, 'Sunroof': False})
print(car2) # Car(Model: Tesla Model S, Color: Blue, Features: {'Autopilot': True, 'Sunroof': True})
5. 原型模式的应用场景
适用于以下情况
- 需要创建多个相似对象
- 例如:游戏角色、汽车模型、家具配置。
- 对象创建成本高
- 例如:数据库连接、网络请求。
- 动态调整对象
- 例如:前端 UI 组件、表单数据。
真实案例
- 前端 UI 组件
- React/Vue 组件克隆(
<Button primary /> -> <Button secondary />
)。
- React/Vue 组件克隆(
- 游戏角色
- 复制角色模板,并修改装备。
- 数据库 ORM
- 复制查询对象(
Query.clone()
)。
- 复制查询对象(
- JavaScript JSON 数据
let obj1 = { name: "Alice", age: 25 }; let obj2 = JSON.parse(JSON.stringify(obj1)); // 深拷贝 obj2.age = 30; console.log(obj1, obj2);
6. 出站链接
7. 站内链接
8. 参考资料
- Gamma, E., Design Patterns: Elements of Reusable Object-Oriented Software (1994).
- Martin, R. C., Clean Code: A Handbook of Agile Software Craftsmanship (2009).
总结
- 原型模式适用于需要克隆复杂对象的场景,避免重复创建。
- 支持浅拷贝和深拷贝,深拷贝适用于嵌套对象。
- 应用广泛,如游戏角色、前端 UI、数据库 ORM。
如果你有具体的应用场景,欢迎讨论!🚀
发表回复