当前位置: 首页 > ops >正文

创建型:原型模式

目录

1、核心思想

2、实现方式

2.1 基本结构

2.2 代码示例(Java)

3、适用场景

4、new与clone实际场景建议


1、核心思想

目的:通过复制(克隆)现有对象来创建新对象,而不是通过new关键字实例化。对于那些有非常复杂的初始化过程的对象或者是需要耗费大量资源的情况,原型模式是更好的选择。

核心价值:通过克隆避免重复初始化,提升性能。

克隆的优势:克隆操作时Java虚拟机会进行内存操作,直接拷贝原型对象数据流生成新的副本对象,绝不会拖泥带水地触发一些多余的复杂操作(如类加载、实例化、初始化等)​,所以其效率远远高于“new”关键字所触发的实例化操作。

注意

1> 浅拷贝与深拷贝

浅拷贝:复制原始类型的值,引用类型只拷贝地址引用(指针),与原对象的应用变量地址指向的内存对象是同一个。

深拷贝:需要在clone方法里,自行递归实现引用对象的clone和赋值,确保与原对象完全独立,注意这里的引用对象也需要实现Cloneable接口。递归赋值会大幅增加资源消耗。

2> 依赖 Cloneable 接口:若类未实现 Cloneable,调用 clone() 会抛出 CloneNotSupportedException。

性能对比

场景new 的消耗clone() 的消耗
简单对象(浅拷贝)较高(跳过构造函数)
复杂对象(深拷贝)可能更高(递归复制)

优缺点

优点缺点
避免重复初始化,提升性能深拷贝实现复杂(尤其循环引用时)
动态生成对象配置(修改原型即可)需为每个类实现克隆方法
隐藏对象创建细节,降低耦合度可能违背构造函数约束(如私有状态)

2、实现方式

2.1 基本结构

  • 抽象原型接口(Prototype):声明克隆方法(如 clone()),对应Cloneable接口。

  • 具体原型实现类(ConcretePrototype):实现克隆方法,定义如何复制自身,实现方法中调用super.clone()即可得到新的浅克隆的对象。

  • 客户端(Client):通过原型对象的 clone() 方法生成新对象。

2.2 代码示例(Java)

// 1. 抽象原型接口  Cloneable// 2. 具体原型类
public class ConcretePrototype implements Cloneable {private String field;private List<String> listField; // 引用类型字段private ObjectTmp objectTmp; // 引用类型字段,ObjectTmp类需要实现Cloneablepublic ConcretePrototype(String field, List<String> listField) {this.field = field;this.listField = listField;}publice void setListField(List<String> listField) {this.listField = listField;}publice void setObjectTmp(ObjectTmp objectTmp) {this.objectTmp= objectTmp;}@Overridepublic ConcretePrototype clone() {try {// 浅拷贝(直接复制引用)ConcretePrototype copy = (ConcretePrototype) super.clone();// 深拷贝(需手动复制引用类型字段)copy.setListField(new ArrayList<>(this.listField));copy.setObjectTmp(this.objectTmp.clone());return copy;} catch (CloneNotSupportedException e) {throw new AssertionError();}}
}// 3. 客户端使用
public class Client {public static void main(String[] args) {ConcretePrototype prototype = new ConcretePrototype("value", Arrays.asList("a", "b"));ConcretePrototype clone = (ConcretePrototype) prototype.clone();}
}

3、适用场景

  • 对象创建成本高:如需要复杂计算的配置对象。

  • 动态生成对象变体:例如游戏中生成不同属性的敌人。

  • 需要隔离对象状态:保证原对象与新对象互不影响。

  • 结合工厂模式使用:用原型注册表管理多种原型对象。

4、new与clone实际场景建议

  • 优先用 new

    • 代码更清晰,符合常规对象创建逻辑。

    • 避免深浅拷贝的潜在问题(如意外共享引用)。

  • 谨慎用 clone()

    • 仅在需要高效复制简单对象时使用(如缓存对象、原型模式)。

    • 确保正确实现 Cloneable 接口并处理深浅拷贝。

  • 替代方案

    • 工厂方法/构建器模式:灵活控制对象创建流程。

    • 序列化/反序列化:实现深拷贝,但性能较差。

public class DeepCopyUtil {public static <T extends Serializable> T deepCopy(T object) {try (ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos)) {oos.writeObject(object);try (ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis)) {return (T) ois.readObject();}} catch (IOException | ClassNotFoundException e) {throw new RuntimeException("Deep copy failed", e);}}
}

http://www.xdnf.cn/news/7114.html

相关文章:

  • 【每天一个知识点】湖仓一体(Data Lakehouse)
  • Vibe Coding:编程中的氛围与效率的艺术
  • 【数据结构】堆
  • BUUCTF——ReadlezPHP
  • KnowCard:我的知识卡片生成器是怎么炼成的?
  • 高能数造闪耀 CIBF 2025,以创新技术引领新能源智造新征程
  • Android 自定义悬浮拖动吸附按钮
  • MyBatis 延迟加载与缓存
  • 【时时三省】(C语言基础)数组习题
  • Linux虚拟文件系统(1)
  • 《沙尘暴》观影记:当家庭成为人性的修罗场
  • 记录一次修改nacos安全问题导致服务调用出现404
  • 【Canvas与诗词】醉里挑灯看剑 梦回吹角连营
  • DeepSeek 赋能脑科学:解锁神经科学研究与应用的新密码
  • 一文讲解Function Calling是什么?
  • vmware虚拟机运行多个产生卡顿问题
  • python打卡第29天
  • Python——一些琐碎知识点
  • Java八股文——Java基础篇
  • 刷题心得:荷兰国旗问题与三指针法题目背景
  • AM32电调学习解读七:其他代码文件介绍
  • 2901. 最长相邻不相等子序列 II
  • Seata源码—6.Seata AT模式的数据源代理一
  • 2025.05.17得物机考笔试真题第二题
  • React 19中useContext不需要Provider了。
  • Java基础知识总结(超详细整理)
  • 32LED心形灯程序源代码
  • 常见的 HTTP 接口(请求方法)
  • PCB设计(十九)PCB设计中NPN/PNP选型策略
  • Window远程连接Linux桌面版