欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


欢迎跳转到本文的原文链接:https://honeypps.com/design_pattern/prototype/

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

 举个例子:
1 原型(实际上是implements了Cloneable接口,进而重写clone()方法)

public class ProtoType implements Cloneable
{private String name;@Overridepublic ProtoType clone(){try{return (ProtoType)super.clone();}catch (CloneNotSupportedException e){e.printStackTrace();}return null;}public String getName(){return name;}public void setName(String name){this.name = name;}
}

2 测试代码

public class MainTest
{public static void main(String[] args){ProtoType pt1 = new ProtoType();pt1.setName("protoType_1");ProtoType pt2 = pt1.clone();System.out.println(pt1 == pt2);System.out.println(pt1.getClass() == pt2.getClass());pt2.setName("protoType_2");System.out.println(pt1.getName()+" "+pt2.getName());}
}

输出:

false
true
protoType_1 protoType_2

 克隆还分为浅克隆和深克隆,细节这里就不赘述了。在《Effective Java》中作者提出了“谨慎地覆盖clone”,文中提出了Cloneable的许多问题,建议使用拷贝构造器的方法来替换Cloneable.

优缺点
优点:

  1. 如果创建新的对象比较复杂时,可以利用原型模式简化对象的创建过程,同时也能够提高效率。
  2. 可以使用深克隆保持对象的状态。
  3. 原型模式提供了简化的创建结构。

缺点:

  1. 在实现深克隆的时候可能需要比较复杂的代码。
  2. 需要为每一个类配备一个克隆方法,而且这个克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难,但对已有的类进行改造时,不一定是件容易的事,必须修改其源代码,违背了“开闭原则”。

适用场景

  1. 如果创建新对象成本较大,我们可以利用已有的对象进行复制来获得。
  2. 如果系统要保存对象的状态,而对象的状态变化很小,或者对象本身占内存不大的时候,也可以使用原型模式配合备忘录模式来应用。相反,如果对象的状态变化很大,或者对象占用的内存很大,那么采用状态模式会比原型模式更好。
  3. 需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的几个组合状态,通过复制原型对象得到新实例可能比使用构造函数创建一个新实例更加方便。

Jdk中的原型模式
java.lang.Object#clone()
java.lang.Cloneable

参考资料:

  1. 《23种设计模式》
  2. 《Effective Java(Second Edition)》Joshua Bloch.
  3. 《细数JDK里的设计模式》

欢迎跳转到本文的原文链接:https://honeypps.com/design_pattern/prototype/

欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


设计模式:原型模式(Prototype)相关推荐

  1. C++设计模式——原型模式(Prototype Pattern)

    C++设计模式--原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录 C++设计模式--原型模式(Prototype Pattern) 目录 定义 代码示例 普通 ...

  2. Java设计模式--原型模式Prototype

    原型模式Prototype 原型模式使得用户可以通过复制对象样本来创建新对象.与通过调用构造函数创建对象相比,二者主要区别在于:通过复制创建的新对象一般会包含原始对象的某些状态. 原型模式属于对象的创 ...

  3. 设计模式---原型模式(Prototype Pattern)

    在编程中有时候我们会发现,当我们需要一个实例,可是这个实例的创建过程十分复杂,在执行过程中 会消耗大量的时间,同时创建第一个实例和创建第二个时间的初始化信息并未改变.在此种情况下,直接New 一个实例 ...

  4. 设计模式-原型模式(Prototype)

    Specify the kinds of objects to create using a prototypical instance,and create new objects bycopyin ...

  5. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...

  6. 设计模式(23):创建型-原型模式(Prototype)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  7. [设计模式]原型模式

    简介 原型模式 (Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式是一种对象创建型模式 (可参考 设计模式 创建型模式). 结构 图-原型模式结构图 Pr ...

  8. 原型模式(ProtoType) - Java里的对象复制

    一, 引用的复制和对象复制. 在编程中, 我们有时会用两个引用指向同一个对象. 例如: ArrayList a = new ArrayLIst(); ArrayList b = a; 看起来好像有a, ...

  9. 设计模式 原型模式_创新设计模式:原型模式

    设计模式 原型模式 原型模式用于创建对象的副本. 这种模式非常有用,特别是当从头开始创建对象的成本很高时. 与builder , factory和abstract factory模式相比,它不会从头开 ...

  10. 设计模式 原型模式_原型设计模式:创建另一个小车

    设计模式 原型模式 创建对象确实是一个耗时的过程,也是一件昂贵的事情. 因此,我们现在正冒险节省时间和金钱. 我们该怎么做? 克隆奇迹多莉 有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物. ...

最新文章

  1. Python 数据类型及其用法
  2. python numpy.linspace() 使用介绍
  3. Android应用程序组件Content Provider在应用程序之间共享数据的原理分析(2)
  4. Angular tsconfig.json 文件里的 paths 用法和 scoped module 定义
  5. 基于Nokia S60的游戏开发之一
  6. win7、offcie 2010是否激活查看方法
  7. python中的命名空间指什么_python中命名空间
  8. iPhone 6s不死!支持升级iOS 14,还能再战两年
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的少儿网站教育管理系统
  10. Java编程语言有哪些优势
  11. Linkedin葵花宝典
  12. php项目宝塔搭建出租屋租赁系统源码带小程序源码
  13. matlab hanning和hann,哪位大侠能告知——为什么在MATLAB2012中不能调研(汉宁)窗函...
  14. hibernate HQL 使用from (select ……)子查询的方法
  15. 如何快速将一张彩色图片变成黑白图片
  16. 梦想起航商务工作PPT模板
  17. Cannot run program jad 的错误
  18. CookieSession
  19. 4.计算机网络与信息安全
  20. excel快速拆分数据的方法

热门文章

  1. mongodb语法与spring实现
  2. signature=94f3cd0155e1d8c8ff09aa94177adccd,研擬顆粒流與連體數值耦合方法模擬山崩產生之震動訊號...
  3. 语音控制面板 通过linux_在Linux中,通常把设备作为( )来处理.
  4. df的缺失值处理 df.isnull()和df.dropna()
  5. 【报错笔记】运行Maven项目时发现项目Build错误
  6. 预定义的类型“System.Object”未定义或未导入
  7. JavaWeb之国际化
  8. JavaScript中的setMonth()方法的小问题 解决:setMonth(month, 1)
  9. 我奋斗了十四年,却依然不能和你坐在一起相亲
  10. JSP输出HTML时产生的大量空格和换行的去除方法