CHARLIE SAYS

查理如是说
DATE 2026-08-24
THEME
SERIES / DESIGN_PATTERNS / P-101 · 设计模式

设计模式 007:原型模式(Prototype)

意图

使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象。

类图

classDiagram
    class Prototype {
        <<abstract>>
        +myClone()* Prototype
    }
    class ConcretePrototype {
        -filed String
        +myClone() Prototype
    }
    class Client
    Prototype <|-- ConcretePrototype
    Client ..> Prototype : 克隆

实现

public abstract class Prototype {
    abstract Prototype myClone();
}

public class ConcretePrototype extends Prototype {
    private String filed;

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

    @Override
    Prototype myClone() {
        return new ConcretePrototype(filed);
    }

    @Override
    public String toString() {
        return filed;
    }
}

public class Client {
    public static void main(String[] args) {
        Prototype prototype = new ConcretePrototype("abc");
        Prototype clone = prototype.myClone();
        System.out.println(clone.toString());
    }
}

输出:

abc

JDK 中的应用

  • java.lang.Object#clone()
  • java.util.ArrayListHashMap 等集合的 clone() 方法(浅拷贝实现)

浅拷贝与深拷贝

原型模式的核心问题是拷贝的深浅,这在 HashMap 源码解析等集合源码中也会遇到:

  • 浅拷贝:只复制对象本身和基本类型字段,引用类型字段仍指向同一对象。Object#clone() 默认即浅拷贝
  • 深拷贝:引用类型字段也递归复制,新旧对象完全独立。通常需要重写 clone() 或通过序列化实现

总结

读完之后问自己下面几个问题,直到可以流利地回答:

  • 使用的场景?
  • 本质是什么?
  • 它解决了什么问题?
  • 它体现了设计模式中什么原则?
  • 存在的缺陷?
  • 你认为与它相关的设计模式有哪些?它们之间的区别有哪些?
  • 开源架构中哪些使用了这一模式?

系列导航

参考

← 开源合规 007:信息安全等级保护认证 目录 软件工程 007:传统模式:软件开发生命周期与过程模型(瀑布模型,原型 →
← 返回文章列表