原型模式(Prototype Pattern)

原型模式(Prototype Pattern)

原型模式是一种 创建型设计模式 ,通过复制现有的实例来创建新的对象,而不是通过实例化(new)来创建,从而提高性能。


原理

  1. 核心思想:提供一个现有对象的模板,通过克隆来创建新的对象。
  2. 适用场景:当对象的创建成本较高,且需要多个类似的对象时,使用原型模式可以提高效率。
  3. 参与角色
    • Prototype(原型接口) :定义克隆方法(通常为 clone())。
    • ConcretePrototype(具体原型类):实现克隆方法,负责实际对象的复制。
    • Client(客户端):通过调用克隆方法创建对象。

优点

  1. 性能高效:通过克隆对象避免了复杂的对象创建过程。
  2. 动态性强:可以在运行时动态创建对象,而不需要依赖具体类。
  3. 灵活性:对于复杂对象可以深拷贝,从而实现完全独立的复制。

缺点

  1. 实现复杂:需要实现深拷贝时,可能会引入额外的复杂性。
  2. 资源消耗:对于深拷贝,克隆过程可能涉及大量的递归或额外的代码。

示例代码

1. 定义原型接口
java 复制代码
// 定义原型接口
public interface Prototype extends Cloneable {
    Prototype clone();
}

2. 具体原型类
java 复制代码
// 具体原型类
public class ConcretePrototype implements Prototype {
    private String name;

    public ConcretePrototype(String name) {
        this.name = name;
    }

    // 实现克隆方法
    @Override
    public Prototype clone() {
        try {
            return (Prototype) super.clone(); // 浅拷贝
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException("Clone not supported", e);
        }
    }

    // Getter 和 Setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "ConcretePrototype{name='" + name + "'}";
    }
}

3. 客户端代码
java 复制代码
public class PrototypeExample {
    public static void main(String[] args) {
        // 创建一个原型对象
        ConcretePrototype prototype = new ConcretePrototype("Original");

        // 克隆对象
        ConcretePrototype clone1 = (ConcretePrototype) prototype.clone();
        ConcretePrototype clone2 = (ConcretePrototype) prototype.clone();

        // 修改克隆对象
        clone1.setName("Clone 1");
        clone2.setName("Clone 2");

        // 打印结果
        System.out.println("Original: " + prototype);
        System.out.println("Clone 1: " + clone1);
        System.out.println("Clone 2: " + clone2);
    }
}

输出结果
text 复制代码
Original: ConcretePrototype{name='Original'}
Clone 1: ConcretePrototype{name='Clone 1'}
Clone 2: ConcretePrototype{name='Clone 2'}

深拷贝和浅拷贝

  • 浅拷贝
    • 复制对象时,只复制基本类型字段。
    • 对于引用类型字段,只复制引用地址(共享同一个引用对象)。
java 复制代码
@Override
public Prototype clone() {
    try {
        return (Prototype) super.clone(); // 默认浅拷贝
    } catch (CloneNotSupportedException e) {
        throw new RuntimeException("Clone not supported", e);
    }
}
  • 深拷贝
    • 复制对象时,除了基本类型字段,还需要递归复制引用类型字段,确保拷贝对象完全独立。
java 复制代码
@Override
public Prototype clone() {
    try {
        ConcretePrototype cloned = (ConcretePrototype) super.clone();
        cloned.setReference(new Reference(this.reference.getValue())); // 手动深拷贝
        return cloned;
    } catch (CloneNotSupportedException e) {
        throw new RuntimeException("Clone not supported", e);
    }
}

使用场景

  1. 对象创建开销大
    • 数据库连接对象、线程池对象。
  2. 重复对象相似度高
    • 图形界面中的按钮、表单等 UI 元素。
  3. 需要动态创建类的实例
    • 在运行时动态加载并复制类。

UML 类图

复制代码
        +-------------------+
        |    Prototype      |
        +-------------------+
        |  + clone()        |
        +-------------------+
                ^
                |
        +-------------------+
        | ConcretePrototype |
        +-------------------+
        |  - name           |
        |  + clone()        |
        +-------------------+
                ^
                |
        +-------------------+
        |     Client        |
        +-------------------+

小结

  • 原型模式通过克隆对象来避免复杂对象的直接创建过程,提高了代码的灵活性和性能。
  • 使用时需特别注意 深拷贝浅拷贝 的实现,尤其是对象中包含引用类型时。
相关推荐
羞儿6 天前
【读点论文】Overall positive prototype for few-shot open-set recognition
原型模式·小样本学习·特征优化·开集学习
liangshanbo12156 天前
手写 Function.prototype.call 与 Function.prototype.apply 面试题满分答案
开发语言·javascript·原型模式
江畔柳前堤7 天前
云原生 × AI 全景图谱:从 Kubernetes 到 Agent 基础设施的一次认知跃迁
人工智能·分布式·gpt·云原生·kubernetes·原型模式·agi
艾伦野鸽ggg8 天前
JavaScript 原型链与原型对象详解
javascript·原型模式
AgentMaster8 天前
元数据、血缘、质量、安全四大模块能力拆解,数据治理方案对比:4 种技术路线深度评测
大数据·数据库·数据仓库·人工智能·原型模式
江畔柳前堤14 天前
具身智能全景深度指南(2026年9月版):从“会聊天的AI“到“能干活的机器“
大数据·javascript·图像处理·人工智能·分布式·智慧城市·原型模式
神奇霸王龙19 天前
Codex MCP GA 实测:Qwen / GLM / Kimi / DeepSeek / MiniMax 调度 Codex 沙箱的真实成本
人工智能·ai·agent·ai编程·原型模式·mcp
葡萄城技术团队20 天前
如何通过 JSON 数据源 / Web API 快速构建轻量级报表(Report)?
前端·json·原型模式
Leo.yuan21 天前
2026国内数据治理平台选型指南:从ETL到数据质量的一体化路径
原型模式
一个游离的指针1 个月前
JS中的对象的相关概念
开发语言·javascript·原型模式