Java设计模式之原型模式详解
一、原型模式核心思想
核心目标:通过克隆现有对象创建新对象,避免重复初始化资源的开销。特别适用于创建成本高或构造流程复杂的对象。
二、原型模式类图(Mermaid)
三、两种克隆方式对比
克隆类型 | 实现方式 | 特点 |
---|---|---|
浅克隆 | 复制对象及值类型字段 | 引用类型字段共享内存 |
深克隆 | 递归复制所有引用对象 | 完全独立的对象副本 |
四、代码实现与示例
1. 浅克隆实现
// 1. 实现Cloneable接口
class ShallowPrototype implements Cloneable {
private int id;
private List<String> data; // 引用类型字段
public ShallowPrototype clone() {
try {
return (ShallowPrototype) super.clone(); // 调用Object.clone()
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
// 客户端使用
ShallowPrototype obj1 = new ShallowPrototype();
ShallowPrototype obj2 = obj1.clone(); // data字段指向同一个List
2. 深克隆实现
class DeepPrototype implements Cloneable {
private int id;
private List<String> data;
public DeepPrototype clone() {
try {
DeepPrototype copy = (DeepPrototype) super.clone();
copy.data = new ArrayList<>(this.data); // 手动复制引用对象
return copy;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
3. 序列图示例(Mermaid)
五、模式优缺点分析
✅ 优势
- 性能优化:避免重复执行初始化代码(如数据库连接)
- 动态创建对象:运行时决定克隆哪个对象
- 简化复杂对象创建:如复制多层嵌套配置对象
❌ 缺点
- 深克隆实现复杂:需递归处理所有引用对象
- 破坏封装性:需要暴露clone方法
六、典型应用场景
- 游戏开发:快速生成大量相似NPC对象
- 配置对象复制:保留默认配置模板并生成修改副本
- 事务回滚:保存对象状态快照用于恢复
- 缓存热更新:克隆更新后的配置对象替换旧版本
七、常见问题解答
Q1:如何选择克隆方式?
- 如果对象仅包含值类型字段 → 浅克隆
- 如果对象包含引用类型字段 → 深克隆
Q2:Java的clone()方法为何需要实现Cloneable接口?
Cloneable
是标记接口(无方法定义),Object.clone()
方法会检查该接口,未实现则抛出CloneNotSupportedException
Q3:深克隆的替代方案?
可通过序列化/反序列化实现(需实现Serializable
接口):
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(original);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
DeepPrototype copy = (DeepPrototype) ois.readObject();
如果文章对你有帮助,请帮忙点点关注吧,谢谢啦!