🧬 原型模式(Prototype Pattern)
✅ 定义
用原型实例指定要创建的对象类型,然后通过复制这个原型来创建新对象。
🧠 它的核心就是:
- 不用 new,而是通过 clone() 快速复制现有对象。
- 适用于构造成本高或重复结构的对象。
🧃 举个生活例子(通俗易懂)
你在用画图工具,画了一个红色圆,设置好了:
你非常满意,想复制一份出来,换个大小继续用。
你不会重新画,而是:
👉「复制粘贴,然后改一下半径就好!」
这就是原型模式的真实写照:
复制(clone)一个已有的对象原型,再按需改动即可。
👨💻 Java 代码实现
🧩 第一步:定义原型接口
1 2 3 4 5 6 7
| public interface Shape extends Cloneable { Shape clone();
void draw(); }
|
Cloneable 是一个标记接口,你必须实现它,Java 才允许你合法地使用 Object.clone() 方法。否则就会抛出 CloneNotSupportedException。
🧩 第二步:实现具体原型类(圆形)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| public class Circle implements Shape { private int radius; private String color; private String border;
public Circle(int radius, String color, String border) { this.radius = radius; this.color = color; this.border = border; }
@Override public void draw() { System.out.println("🎨 画一个" + color + "的圆,半径:" + radius + ",边框:" + border); }
public void setRadius(int radius) { this.radius = radius; }
@Override public Circle clone() { try { return (Circle) super.clone(); } catch (CloneNotSupportedException e) { throw new RuntimeException("克隆失败", e); } } }
|
🧪 第三步:客户端使用
1 2 3 4 5 6 7 8 9 10 11 12
| public class Main { public static void main(String[] args) { Circle original = new Circle(100, "红色", "黑色边框"); original.draw();
Circle clone = original.clone(); clone.setRadius(150); clone.draw(); } }
|
💡 输出结果:
1 2
| 🎨 画一个红色的圆,半径:100,边框:黑色边框 🎨 画一个红色的圆,半径:150,边框:黑色边框
|
📌 类图结构(文字描述)
1 2 3 4 5 6 7 8 9 10 11
| ┌──────────────┐ │ Shape │ <─── 原型接口(定义 clone 方法) └──────▲───────┘ │ ┌──────┴───────┐ │ Circle │ <─── 实际的可复制对象(原型) └──────▲───────┘ │ ┌──────┴───────┐ │ Client │ <─── 使用 clone() 复制对象 └──────────────┘
|
🎯 小结:
| 原型模式好处 |
对应解释 |
| 🧠 避免重复创建逻辑 |
不需要 new 和 set 一大堆属性 |
| ⚡ 性能更高 |
对象复杂时,复制比重新构建效率高 |
| 🎯 更好地保持一致性 |
所有副本来自一个原型,统一配置,无需担心遗漏字段 |
📦 典型应用场景
- 需要频繁创建结构相似对象(如图形、订单、配置模板)
- 对象构造非常复杂,代价高(如加载配置、读取文件等)
- 缓存场景中复用已有对象模板进行修改(Spring Bean 原型)
🧠 总结一句话
原型模式让你通过复制(clone)一个对象,而不是重新 new 出一个,用来快速得到相似对象,简单、高效、统一。