竹笋

注册

 

发新话题 回复该主题

设计模式第三讲原型模式及其使用场景,深 [复制链接]

1#

原型模式(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对象高很多。

使用场景:资源、性能优化场景,如上例中,当有大量消息需要处理时,减少硬件资源消耗非常重要,决定系统的并发吞吐量;一个对象多个修改者的场景,如一封邮件,我们需要同时发送给多个接收人,假如邮件系统不支持群发,我们需要对每一个接收人发送一封邮件,此时需要修改邮件接收地址,如果采用多线程发送,可以采用原型模式。

实际应用中,原型模式一般会和工厂模式一起使用,通过原型对象的clone方法去创建出新的对象,再由工厂方法(getMessage)提供给调用者,如图2所示。

分享 转发
TOP
发新话题 回复该主题