![设计模式就该这样学:基于经典框架源码和真实业务场景](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=1739296074-pcC1tnf1JPNqudrEboyZoCBeqttcgdh4-0-b2c3e43936c8da342e70def1df19d8f1)
上面的代码看上去非常工整,命名非常规范,注释也写得很全面。但是,大家觉得这样的代码优雅吗?笔者认为,这样的代码属于纯体力劳动。那原型模式能够帮助我们大量地避免这种纯体力劳动,提高开发效率。
原型模式主要适用于以下应用场景。
(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=1739296074-cKkcF31MUOKCxPJeXjzdQvxG9AvHSZDJ-0-3c6b41d06b62afae3e644081e86c9ccf)
由上图可以看到,原型模式主要包含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=1739296074-2K44DYtEcEAsOqbgP5vCJsy6XNQ7JrxT-0-f2490d1328cd46c7ad45583860cb97fa)
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt011_4.jpg?sign=1739296074-34pNTEoxNLHnblwkdXx9f8X23T94zvyH-0-d8648db2aad539ab263281ade51ef3e6)
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt011_5.jpg?sign=1739296074-RZHyLt77imUQAghJ9khZAaBdS2H2NFKc-0-d5a90b543f2460766f3bd24b28da62a4)