Java|设计模式第三讲:原型模式及其使用场景,深、浅拷贝的概念


Java|设计模式第三讲:原型模式及其使用场景,深、浅拷贝的概念
文章图片

原型模式(Prototype):用对象的类创建原型实例(对象) , 再通过原型实例创建新对象 。 多用于在保证性能的情况下 , 创建重复对象 。
举个例子:在造飞机的过程中 , 图纸好比类 , 原型机好比原型对象 , 最后量产的飞机是参照原型机生产出来的 。
我们在进行网络编程的时候 , 消息需要从字节流转换成java对象 , 我们以这种场景为例进行说明 , 如下图1 。 图1中第10—12行重写了Message继承自Object类的clone方法 , 调用Message的clone方法后返回的是Message对象 , 如果不重写clone方法返回的就会是object对象 。
图1
我们再写一个消息工厂类(工厂模式将会在后面进行讲解) , 来处理实时接收到的消息 。
图2
需要注意的是Java语言Object对象提供的clone方法属于浅拷贝 , 即只会复制基本变量和关联对象的引用 , 不会复制关联对象 。 如果有对象类型的成员 , 则成员对象也需要实现Cloneable接口 , 覆盖clone方法 , 且如图1的clone方法中需要对成员变量重新赋值为克隆出来的新成员对象 , 每一层对象都进行了复制 , 属于深拷贝 。
Java克隆时 , 虚拟机直接拷贝原型对象流生成新副本 , 不会触发类加载、实例化、初始化等操作 , 效率比new对象高很多 。
使用场景:资源、性能优化场景 , 如上例中 , 当有大量消息需要处理时 , 减少硬件资源消耗非常重要 , 决定系统的并发吞吐量;一个对象多个修改者的场景 , 如一封邮件 , 我们需要同时发送给多个接收人 , 假如邮件系统不支持群发 , 我们需要对每一个接收人发送一封邮件 , 此时需要修改邮件接收地址 , 如果采用多线程发送 , 可以采用原型模式 。
【Java|设计模式第三讲:原型模式及其使用场景,深、浅拷贝的概念】实际应用中 , 原型模式一般会和工厂模式一起使用 , 通过原型对象的clone方法去创建出新的对象 , 再由工厂方法(getMessage)提供给调用者 , 如图2所示 。