创建型 简单
原型模式
Prototype Pattern
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
概述
原型模式是一种创建型设计模式,它允许你复制已有对象,而无需使代码依赖它们所属的类。通过定义一个统一的克隆接口,所有实现了该接口的对象都可以被复制,而无需知道具体类型。
适用场景
- •当需要创建的对象与现有对象相似时(只有部分属性不同)
- •当需要避免与对象创建类之间的高耦合时
- •当需要创建的对象种类繁多,整合到一个工厂类中会导致工厂类过于庞大时
- •当需要避免使用继承来创建对象,而希望通过组合来扩展对象行为时
优点
- +可以克隆对象,而无需与它们的具体类耦合
- +可以移除重复的初始化代码,预生成原型
- +可以更方便地生成复杂对象,无需知道具体的创建细节
- +可以保存对象状态,在需要时恢复(备忘录模式的基础)
缺点
- −克隆包含循环引用的复杂对象可能会非常困难
- −需要为每个类实现克隆方法,可能违反开闭原则
- −深拷贝和浅拷贝需要谨慎处理,避免潜在的副作用
结构
classDiagram
class Prototype {
<<interface>>
+clone() Prototype
}
class ConcretePrototype {
-id: string
-data: Object
-timestamp: Date
+clone() Prototype
+getId() string
+getData() Object
}
class PrototypeRegistry {
-prototypes: Map~string, Prototype~
+register(key: string, prototype: Prototype)
+get(key: string): Prototype
+remove(key: string)
}
class Client {
+main()
}
Prototype <|.. ConcretePrototype
Client --> Prototype : uses
Client --> PrototypeRegistry : uses
PrototypeRegistry ..> Prototype : manages
style Prototype fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
style ConcretePrototype fill:#fff3e0,stroke:#f57c00,stroke-width:2px
style PrototypeRegistry fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
style Client fill:#f5f5f5,stroke:#616161,stroke-width:1px
交互演示
通过克隆创建新对象
➕
Create
clone()
Empty
Empty
Empty
Empty
点击左侧创建原型对象
生活类比
原型模式就像是现实世界中的细胞分裂和文档模板复制
细胞分裂
细胞通过分裂产生新的细胞,新细胞与原始细胞具有相同的遗传信息(DNA)。就像原型模式复制对象的所有属性。
文档模板
我们通常会创建一个文档模板,然后基于这个模板复制出多份文档。每份文档都是独立的,修改一份不会影响其他文档。
绘画模板
艺术家使用绘画模板来复制图案,每个新图案都是模板的复制品,但可以独立修改颜色、大小等属性。
代码实现
Example.java
实际应用
Java Object.clone()
Java 所有类的基类 Object 提供了 clone() 方法,所有实现了 Cloneable 接口的类都可以被克隆。
Example.java
React/Vue 组件的 props 复制
在前端框架中,组件可以通过 props 复制来创建新的组件实例,这也是原型模式的应用。
Example.java
数据库连接池
数据库连接池通常预先创建一些连接对象作为原型,需要时克隆这些原型而不是重新创建连接。
Example.java
练习
1
原型模式的主要目的是什么?
2
深拷贝和浅拷贝的主要区别是什么?
3
在原型模式中,客户端需要知道具体原型类的实现细节吗?
4