1、原型模式的使用和本质、以及优势:

a、通过 new 产生一个对象需要非常繁琐的数据准备或者访问权限,则可以使用原型模式。

b、原型模式的使用就是 java 中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型对象的特点。

c、其优势有:效率高(直接克隆,避免了重新执行构造过程步骤)。

d、克隆类似于 new, 但是不同于 new 。new 创建新的对象属性采用的是默认值。克隆出的对象的属性值完全和原型对象相同。并且克隆出来的新对象改变不会影响原型对象。(可以对克隆对象修改属性值)

2、原型模式的实现:

-  Clone 接口 和 clone 方法

-  简单的代码演示:

a、可以看到,在 Sheep 这个类中实现了 Cloneable 接口,并且覆盖了 父类 Object 的 clone() 方法。(这样就实现了浅克隆)

package com.geeklicreed.prototype;import java.util.Date;public class Sheep implements Cloneable{private Date birthday;private String name;public Date getBirthday(){return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overrideprotected Object clone() throws CloneNotSupportedException {Object obj = super.clone();return obj;}public Sheep(Date birthday, String name) {super();this.birthday = birthday;this.name = name;}public Sheep() {// TODO Auto-generated constructor stub}
}

b、在 Client06 测试类中可以看到,克隆出来的 Sheep 对象和原来的 Sheep 对象是两个不同的对象,但是它们两的属性值相同。

package com.geeklicreed.prototype;import java.util.Date;public class Client {public static void main(String[] args) throws Exception {Date date = new Date(1320948723000L);Sheep s1 = new Sheep(date,"多利");Sheep s2 = (Sheep)s1.clone();System.out.println(s1);System.out.println(s1.getName());System.out.println(s2);System.out.println(s2.getName());/*输出结果为:com.geeklicreed.prototype.Sheep@2a139a55多利com.geeklicreed.prototype.Sheep@15db9742多利*/}
}

c、上面提到了浅克隆的问题,现在看看在 Client06 测试类修改一些代码后的输出结果。

package com.geeklicreed.prototype;import java.util.Date;public class Client {public static void main(String[] args) throws Exception {Date date = new Date(1320928712391L);Sheep s1 = new Sheep(date, "多利");Sheep s2 = (Sheep)s1.clone();System.out.println(s1.getBirthday());date.setTime(3302428929382983L);System.out.println(s1.getBirthday());System.out.println(s2.getBirthday());/*输出结果为:Thu Nov 10 20:38:32 CST 2011Sat Oct 23 09:16:22 CST 106619Sat Oct 23 09:16:22 CST 106619*/}
}

-  注:可以看到,在测试结果中, Sheep 类的 对象 s1 和 s2 是共同使用 Date 对象,所以当 Date 对象的值发生修改时,它们两个的 brithday 属性值也就发生修改。(浅克隆只对对象进行克隆,深克隆是将对象的属性值也进行克隆操作。)

d、将 Sheep 类中的 clone 方法进行如下修改,就可以实现深克隆。

@Overrideprotected Object clone() throws CloneNotSupportedException {Object obj = super.clone();Sheep sheep = (Sheep) obj;sheep.birthday = (Date) this.birthday.clone();//即将对象的属性也复制一遍return obj;}
package com.geeklicreed.prototype;import java.util.Date;public class Client {public static void main(String[] args) throws Exception {Date date = new Date(1320928712391L);Sheep s1 = new Sheep(date, "多利");Sheep s2 = (Sheep)s1.clone();System.out.println(s1.getBirthday());date.setTime(3302428929382983L);System.out.println(s1.getBirthday());System.out.println(s2.getBirthday());/*输出结果为:Thu Nov 10 20:38:32 CST 2011Sat Oct 23 09:16:22 CST 106619Thu Nov 10 20:38:32 CST 2011*/}
}

3、使用序列化和反序列化实现深克隆:

package com.geeklicreed.prototype;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Date;public class Client {public static void main(String[] args) throws Exception {Date date = new Date(1320928712391L);Sheep s1 = new Sheep(date, "多利");//使用序列化和反序列化实现深克隆ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(s1);byte[] by = bos.toByteArray();ByteArrayInputStream bis = new ByteArrayInputStream(by);ObjectInputStream ois = new ObjectInputStream(bis);Sheep s2 = (Sheep) ois.readObject();date.setTime(222324131028374983L);System.out.println(s1.getBirthday());System.out.println(s2.getBirthday());/*输出结果为:Thu Apr 03 07:26:14 CST 7047141Thu Nov 10 20:38:32 CST 2011*/}
}

-  注:序列化和反序列化需要在在 Sheep 类中 实现 Serializable 接口。

4、开发中的应用场景:

-  原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。

-  spring 中 bean 的创建实际上就是两种:单例模式和原型模式。(原型模式一般会和工厂模式搭配使用。)

转载于:https://blog.51cto.com/12402717/1928342

设计模式之原型模式prototype相关推荐

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

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

  2. 设计模式之原型模式(Prototype)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  3. 【设计模式】—— 原型模式Prototype

    前言:[模式总览]----------by xingoo 模式意图 由于有些时候,需要在运行时指定对象时哪个类的实例,此时用工厂模式就有些力不从心了.通过原型模式就可以通过拷贝函数clone一个原有的 ...

  4. java prototype是什么,java设计模式-原型模式(Prototype)

    定义 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象.这就是原型模式的用意 原型模式的结构 原型模式要求对象实现同一个可 ...

  5. 温故而知新:设计模式之原型模式(Prototype)

    原型模式个人以为最适合的场景:参照现有的某一个对象实例,快速得到多个完整的实例副本.(通常是深拷贝的副本) 深拷贝在c#中实现的最简单方式莫过于通过反序列化得到一个全新的对象实例.(当然如果浅拷贝的话 ...

  6. 设计模式五: 原型模式(Prototype)

    简介 原型模式是属于创建型模式的一种,是通过拷贝原型对象来创建新的对象. 万能的Java超类Object提供了clone()方法来实现对象的拷贝. 可以在以下场景中使用原型模式: 构造函数创建对象成本 ...

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

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

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

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

  9. C#设计模式(6)——原型模式(Prototype Pattern)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

最新文章

  1. 【Qt】通过QtCreator源码学习Qt(十):多国语言支持
  2. 运维7年,对Linux的经验总结
  3. 自己动手实现操作系统引导程序(OS bootloader)——借助QEMU/GDB/losetup/dd等工具
  4. Wireshark网络抓包实践
  5. 分享几个matlab的下载安装包吧,一周有效期,过期不候
  6. SlidingMenu实现侧滑
  7. 警告:‘xxxx’ 将随后被初始化
  8. ubuntu18.04错误配置变量环境导致无法进入系统
  9. deepin终端编译c程序_Deepin Linux安装使用Visual Studio Code(VSCode)调试C++
  10. linux下覆盖文件命令,在Linux中使用命令行进行文件覆盖的操作
  11. matlab优化 带参数设置,优化选项参考 - MATLAB Simulink - MathWorks 中国
  12. 虚拟机安装 服务器 Ubuntu Server20.04.2
  13. 详解Java类对象执行顺序
  14. 微信公众号开发之创建菜单栏代码示例(php)
  15. 第一个Eureka Service
  16. C#图片处理(裁剪,缩放,清晰度,水印)
  17. [html] 回到页首
  18. 人工智能时代孩子该学点什么?
  19. vim 快速删除一个英文单词
  20. 【Android -- 架构】MVP 模式

热门文章

  1. 我看过的密码学方面的好文章
  2. Java:判断一个字符串中是否存在另一个字符子串以及判断一个字符串中是否存在指定字符
  3. java写方法用来调用_Java从入门到入土(79)lambda表达式和方法引用
  4. 阿里云查看mysql版本_查看mysql版本
  5. android怎么搭建人脸库,OpenCV-2.4.6-android-sdk 人脸识别demo搭建
  6. android 组件导出安全,App安全检测实践基础:组件安全(二)
  7. Windows10系统变慢,程序员该出手了,电脑性能大幅度提升!
  8. linux 脚本给设备节点权限,[Linux] I2C设备读写及文件节点创建
  9. react滑动切换tab动画效果_Swiper - 免费开源、功能强大的触摸滑动js特效插件
  10. sar极化想干矩阵_用于PolSAR图像分类的极化卷积网络