创建型 简单

原型模式

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

以下哪种场景最适合使用原型模式?