1、什么是原型模式

Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.

Prototype Design Pattern:用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象。

说人话:对象复制

2、原型模式的两种实现方法

我们日常开发中,应该有使用过 BeanUtils.copyProperties()方法,其实这就是原型模式的一种用法(浅拷贝)。原型模式实现分两种:

①、浅拷贝:只会复制对象中基本数据类型数据和引用对象的内存地址,不会递归地复制引用对象,以及引用对象的引用对象

②、深拷贝:得到的是一份完完全全独立的对象。

Java 中 Object 类是所有类的根类,Object 类提供了一个 clone()方法,该方法可以将一个 Java 对象复制一份,但是在调用 clone方法的Java类必须要实现一个接口Cloneable,这是一个标志接口,标志该类能够复制且具有复制的能力,如果不实现 Cloneable 接口,直接调用clone方法,会抛出 CloneNotSupportedException 异常。

/**
* A class implements the <code>Cloneable</code> interface to
* indicate to the {@link java.lang.Object#clone()} method that it
* is legal for that method to make a
* field-for-field copy of instances of that class.
* <p>
* Invoking Object's clone method on an instance that does not implement the
* <code>Cloneable</code> interface results in the exception
* <code>CloneNotSupportedException</code> being thrown.
* <p>
* By convention, classes that implement this interface should override
* <tt>Object.clone</tt> (which is protected) with a public method.
* See {@link java.lang.Object#clone()} for details on overriding this
* method.
* <p>
* Note that this interface does <i>not</i> contain the <tt>clone</tt> method.
* Therefore, it is not possible to clone an object merely by virtue of the
* fact that it implements this interface. Even if the clone method is invoked
* reflectively, there is no guarantee that it will succeed.
*
* @author unascribed
* @see java.lang.CloneNotSupportedException
* @see java.lang.Object#clone()
* @since JDK1.0
*/
public interface Cloneable {
}

关于深浅拷贝的详细说明,可以参考我的这篇博客:

https://www.cnblogs.com/ysocean/p/8482979.html

3、原型模式的优点

①、性能高

原型模式是在内存二进制流的拷贝, 要比直接new一个对象性能好很多, 特别是要在一个循环体内产生大量的对象时, 原型模式可以更好地体现其优点。

②、避免构造函数的约束

这既是它的优点也是缺点,直接在内存中拷贝,构造函数是不会执行的 。 优点就是减少了约束, 缺点也是减少了约束, 需要大家在实际应用时考虑。

4、原型模式使用场景

①、在需要一个类的大量对象的时候,使用原型模式是最佳选择,因为原型模式是在内存中对这个对象进行拷贝,要比直接new这个对象性能要好很多,在这种情况下,需要的对象越多,原型模式体现出的优点越明显。

②、如果一个对象的初始化需要很多其他对象的数据准备或其他资源的繁琐计算,那么可以使用原型模式。

③、当需要一个对象的大量公共信息,少量字段进行个性化设置的时候,也可以使用原型模式拷贝出现有对象的副本进行加工处理。

最新文章

  1. Ubuntu创建桌面快捷方式
  2. MMORPG大型游戏设计与开发(规范)
  3. POJ3321 Apple Tree(树状数组)
  4. C#学习笔记(二)——变量和表达式
  5. mysql隔离机制
  6. HDU 4721 Food and Productivity (二分+树状数组)
  7. MFC解决View中添加控件闪烁
  8. js 获取单项复选的值
  9. MSSQL Server查询优化方法(转)
  10. 如何使用Git以及GitHub
  11. Hadoop的多节点集群启动,唯独没有namenode进程?(血淋淋教训,一定拍快照)(四十五)
  12. 运用BT在centos下搭建一个博客论坛
  13. (转)Windows10下的docker安装与入门 (一)使用docker toolbox安装docker
  14. Centos7之系统优化
  15. 机器学习算法总结(五)——聚类算法(K-means,密度聚类,层次聚类)
  16. Python中syncio和aiohttp
  17. python 爬虫&amp;爬取豆瓣电影top250
  18. IDEA运行android项目一直是同一个apk
  19. JUnit报错 java.lang.Exception:No tests found matching
  20. PHP目前比较常见的五大运行模式SAPI(转)

热门文章

  1. 位运算符的用法 ----非(!),与(&amp;),或(|),异或(^)
  2. 使用CEF(四)— 在QT中集成CEF(1):基本集成
  3. 开发函数计算的正确姿势——OCR 服务
  4. 为什么下一个十年的主战场在 Serverless?
  5. 洛谷3613睡觉困难综合征(LCT维护链信息(前后缀)+贪心)
  6. yum源安装nginx
  7. Protocol handler start failed
  8. Web前端安全之安全编码原则
  9. 利用python爬取全国水雨情信息
  10. STM32中操作寄存器GPIOB_CRL &amp;= ~( 0x0F&lt;&lt; (4*0))与GPIOB_CRL &amp;=~(0x0F)之间有什么区别吗?