
第9章 原型模式
9.1 原型模式概述
9.1.1 原型模式的定义
原型模式(Prototype Pattern)指原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象,属于创建型设计模式。
原文:Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.
原型模式的核心在于复制原型对象。以系统中已存在的一个对象为原型,直接基于内存二进制流进行复制,不需要再经历耗时的对象初始化过程(不调用构造函数),性能提升许多。当对象的构建过程比较耗时时,可以把当前系统中已存在的对象作为原型,对其进行复制(一般是基于二进制流的复制),躲避初始化过程,使得新对象的创建时间大大缩短。
9.1.2 原型模式的应用场景
你一定遇到过大篇幅Getter、Setter赋值的场景,例如下面的代码。

上面的代码看上去非常工整,命名非常规范,注释也写得很全面。但是,大家觉得这样的代码优雅吗?笔者认为,这样的代码属于纯体力劳动。那原型模式能够帮助我们大量地避免这种纯体力劳动,提高开发效率。
原型模式主要适用于以下应用场景。
(1)创建对象成本较大(例如,初始化时间长,占用CPU太多,或者占用网络资源太多等),需要优化资源。
(2)创建一个对象需要烦琐的数据准备或访问权限等,需要提高性能或者提高安全性。
(3)系统中大量使用该类对象,且各个调用者都需要给它的属性重新赋值。
在Spring中,原型模式应用得非常广泛,例如scope="prototype"、JSON.parseObject(),都是原型模式的具体应用。
9.1.3 原型模式的UML类图
原型模式的UML类图如下。

由上图可以看到,原型模式主要包含3个角色。
(1)客户(Client):客户类提出创建对象的请求。
(2)抽象原型(IPrototype):规定复制接口。
(3)具体原型(ConcretePrototype):被复制的对象。
注:不是通过new关键字而是通过对象复制来实现创建对象的模式被称作原型模式。
9.1.4 原型模式的通用写法
按照原型模式的UML类图,实现原型模式的通用代码如下。


