![设计模式就该这样学:基于经典框架源码和真实业务场景](https://wfqqreader-1252317822.image.myqcloud.com/cover/758/33114758/b_33114758.jpg)
第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赋值的场景,例如下面的代码。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt011_1.jpg?sign=1738969519-u1fp0nwEjuPerMfYYMs0BKTf4rcQm2qk-0-6e67c9fb853a7dc90649bd19bf04a587)
上面的代码看上去非常工整,命名非常规范,注释也写得很全面。但是,大家觉得这样的代码优雅吗?笔者认为,这样的代码属于纯体力劳动。那原型模式能够帮助我们大量地避免这种纯体力劳动,提高开发效率。
原型模式主要适用于以下应用场景。
(1)创建对象成本较大(例如,初始化时间长,占用CPU太多,或者占用网络资源太多等),需要优化资源。
(2)创建一个对象需要烦琐的数据准备或访问权限等,需要提高性能或者提高安全性。
(3)系统中大量使用该类对象,且各个调用者都需要给它的属性重新赋值。
在Spring中,原型模式应用得非常广泛,例如scope="prototype"、JSON.parseObject(),都是原型模式的具体应用。
9.1.3 原型模式的UML类图
原型模式的UML类图如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt011_2.jpg?sign=1738969519-ZPS7S1Nyktrb2pfVUVXhir6sBgJgW27g-0-1d4693f7ec354ba948d3a348a96b3d1e)
由上图可以看到,原型模式主要包含3个角色。
(1)客户(Client):客户类提出创建对象的请求。
(2)抽象原型(IPrototype):规定复制接口。
(3)具体原型(ConcretePrototype):被复制的对象。
注:不是通过new关键字而是通过对象复制来实现创建对象的模式被称作原型模式。
9.1.4 原型模式的通用写法
按照原型模式的UML类图,实现原型模式的通用代码如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt011_3.jpg?sign=1738969519-26jiF9f5NSQ8ktaR7eUhwFoFidg1N4VF-0-709b5023169aa4cd97c1127657f60acf)
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt011_4.jpg?sign=1738969519-dHr41mNmb7iDm78uvCV60fNxeYtzYMLZ-0-d4b69c89d9744b80ea4504080372b146)
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt011_5.jpg?sign=1738969519-jug3KgwAjgqxdlPXIlfxZgUE7BDEPi1S-0-a10272493223925cc855ebe2e89a8ce6)