前言

原型设计模式是一种创建型设计模式,允许一个对象再创建另一个可定制的对象,无需知道如何创建对象的细节,springmvc框架中的单例(singleton)与多例(prototype)正是基于该设计模式而设计的。原型设计模式分为俩种,一种是浅拷贝,另一种是深拷贝。浅拷贝指的是对于基本数据类型和引用类型的变量通过值传递和引用传递,通俗易懂的说法就是,原对象的任何更改都会影响到克隆对象。而深拷贝是通过完整的克隆,重新创建一个新的对象,原对象的更改不会影响到克隆对象。浅拷贝通过实现Cloneable接口,重写clone方法实现。深拷贝可以通过重写clone方法或者实现Serializable序列化接口,通过序列化实现对象深拷贝。多用于复杂对象的创建,简化对象创建过程。本节我们以克隆多莉羊为例,实现原型模式的一个案例。

正文

浅拷贝

  • 创建多莉羊类
package com.yundi.atp.dp.prototype.shallow;/*** @Author: 北溟溟* @Description: 原型设计模式:浅拷贝,创建一只多莉羊并实现其Cloneable接口* @Date: 2022/3/16 9:23* @Version: 1.0.0*/
public class SheepClone implements Cloneable {/*** 名称*/private String name;/*** 产地*/private SheepAddress sheepAddress;public void printSheep() {System.out.println(name + ":" + "是一只克隆羊!");}public SheepClone(String name, SheepAddress sheepAddress) {this.name = name;this.sheepAddress = sheepAddress;}public String getName() {return name;}public void setName(String name) {this.name = name;}public SheepAddress getSheepAddress() {return sheepAddress;}public void setSheepAddress(SheepAddress sheepAddress) {this.sheepAddress = sheepAddress;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}public static void main(String[] args) throws CloneNotSupportedException {SheepClone sheep = new SheepClone("多莉", new SheepAddress("内蒙古", "呼和浩特市"));sheep.printSheep();System.out.println("sheep:" + sheep.hashCode() + "--------" + "sheepAddress:" + sheep.sheepAddress.hashCode() + "-------" + sheep.sheepAddress.getProvince() + "-------" + sheep.sheepAddress.getCity());//调用克隆方法克隆一只多莉羊SheepClone cloneSheep = (SheepClone) sheep.clone();cloneSheep.printSheep();//更改多莉羊的产地sheep.getSheepAddress().setProvince("新疆");sheep.getSheepAddress().setCity("乌鲁木齐");//克隆的多莉羊属性System.out.println("cloneSheep:" + cloneSheep.hashCode() + "--------" + "sheepAddress:" + cloneSheep.sheepAddress.hashCode() + "-------" + cloneSheep.sheepAddress.getProvince() + "-------" + cloneSheep.sheepAddress.getCity());}
}
  • 创建多莉羊产地类
package com.yundi.atp.dp.prototype.shallow;/*** @Author: 北溟溟* @Description: 羊的产区* @Date: 2022/3/22 14:58* @Version: 1.0.0*/
public class SheepAddress {private String province;private String city;public SheepAddress(String province, String city) {this.province = province;this.city = city;}public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}
}

深拷贝

  • 创建多莉羊类
package com.yundi.atp.dp.prototype.deep;import java.io.*;/*** @Author: 北溟溟* @Description: 原型设计模式:深拷贝* @Date: 2022/3/16 9:23* @Version: 1.0.0*/
public class SheepClone implements Cloneable, Serializable {/*** 名称*/private String name;/*** 产地*/private SheepAddress sheepAddress;public void printSheep() {System.out.println(name + ":" + "是一只克隆羊!");}public SheepClone(String name, SheepAddress sheepAddress) {this.name = name;this.sheepAddress = sheepAddress;}public String getName() {return name;}public void setName(String name) {this.name = name;}/*** 方式一: 通过重写clone方法实现深拷贝** @return* @throws CloneNotSupportedException*/@Overrideprotected Object clone() throws CloneNotSupportedException {//完成对属性为基本数据类型和String的克隆Object deep = super.clone();SheepClone sheepClone = (SheepClone) deep;sheepClone.sheepAddress = (SheepAddress) sheepAddress.clone();return sheepClone;}/*** 方式二: 通过序列化反序列化实现深拷贝(推荐使用)** @return*/public Object deepClone() {//创建流对象ByteArrayOutputStream bos = null;ObjectOutputStream oos = null;ByteArrayInputStream bis = null;ObjectInputStream ois = null;try {//序列化bos = new ByteArrayOutputStream();oos = new ObjectOutputStream(bos);oos.writeObject(this);//反序列化bis = new ByteArrayInputStream(bos.toByteArray());ois = new ObjectInputStream(bis);SheepClone sheepClone = (SheepClone) ois.readObject();return sheepClone;} catch (Exception e) {e.printStackTrace();return null;} finally {//关闭流try {bos.close();oos.close();bis.close();ois.close();} catch (Exception e2) {System.out.println(e2.getMessage());}}}public static void main(String[] args) throws CloneNotSupportedException {SheepClone sheep = new SheepClone("多莉", new SheepAddress("内蒙古", "呼和浩特市"));sheep.printSheep();System.out.println("sheep:" + sheep.hashCode() + "--------" + "sheepAddress:" + sheep.sheepAddress.hashCode());SheepClone cloneSheepOne = (SheepClone) sheep.clone();cloneSheepOne.printSheep();System.out.println("cloneSheep:" + cloneSheepOne.hashCode() + "--------" + "sheepAddress:" + cloneSheepOne.sheepAddress.hashCode());SheepClone cloneSheepTwo = (SheepClone) sheep.clone();cloneSheepTwo.printSheep();System.out.println("cloneSheep:" + cloneSheepTwo.hashCode() + "--------" + "sheepAddress:" + cloneSheepTwo.sheepAddress.hashCode());}
}
  • 创建多莉羊产地
package com.yundi.atp.dp.prototype.deep;import java.io.Serializable;/*** @Author: 北溟溟* @Description: 羊的产区(测试引用对象的克隆)* @Date: 2022/3/22 14:58* @Version: 1.0.0*/
public class SheepAddress implements Cloneable, Serializable {private String province;private String city;public SheepAddress(String province, String city) {this.province = province;this.city = city;}public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}

结语

本节关于原型设计模式的案例到这里就结束了,我们下期见。。。

(六)JAVA设计模式——原型设计模式案例实现相关推荐

  1. 创建设计模式 - 原型设计模式

    创建设计模式 - 原型设计模式 原型设计模式是Creational Design模式之一,因此它提供了一种对象创建机制. 原型设计模式 当对象创建成本高昂并且需要大量时间和资源并且您已经存在类似对象时 ...

  2. 设计模式—原型设计模式

    原型设计模式 1.概述 2.结构 3.实现 4.案例 5.使用场景 6.扩展(深克隆) 1.概述 通过复制现有实例来创建新的实例,无需知道相应类的信息.用一个已经创建的实例作为原型,通过复制该原型对象 ...

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

    github地址:https://github.com/1711680493 点我进入github 如需了解更多设计模式,请进入我的设计模式专栏 原型设计模式 将一个对象作为原型,通过对其进行复制而克 ...

  4. 产品原型示例_原型设计模式示例

    产品原型示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原因 ...

  5. JavaScript:原型设计模式

    在JavaScript中有很多设计模式,例如工厂模式.模块模式.发布订阅模式.单例模式等等,这里主要说的是一种比较重要的设计模式---原型设计模式. 所谓原型设计模式,我参考了网上比较多的解释,这种设 ...

  6. 第六章 Caché 设计模式 原型模式

    文章目录 第六章 Caché 设计模式 原型模式 定义 使用场景 优点 结构图 描述 示例 初级写法 缺点 中级写法 缺点 高级写法 (浅复制) 浅复制 深复制 完整示例 简历类(复制类) 对象类(工 ...

  7. Java常用设计模式————原型模式(一)

    介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...

  8. Java中的原型设计模式

    Prototype design pattern is one of the Creational Design pattern, so it provides a mechanism of obje ...

  9. Java设计模式之模板方法设计模式(银行计息案例)

    不知道为什么,这几天对Java中的设计模式非常感兴趣,恰巧呢这几天公司的开发任务还不算太多,趁着有时间昨天又把模板方法模式深入学习了一下,做了一个客户在不同银行计息的小案例,感触颇深,今天给各位分享一 ...

最新文章

  1. 如何在单页应用程序Angular 7中使用FastReport Core Web报表
  2. 字符编码的发展(ASCII、Unicode、utf-8)
  3. c++ vector嵌套传参
  4. 第二节 MATLAB中图像数据导入、导出和转换
  5. MySQL优化之查询缓存(mysql8官方已经废弃这个功能)
  6. codematic2连接mysql失败_怎么连接oracle数据库
  7. 【贪心】国王游戏(ybtoj 贪心-1-4)
  8. Spring框架声明式事务管理
  9. mysql一张表可以用吗_MySQL表操作
  10. AspxGridView 主子表设置
  11. configure:3855: gcc -V 5 gcc: error: unrecognized command line option '-V'
  12. 更新管理器_Excel2016数据透视表06:名称管理器实现透视表的动态更新
  13. 世嘉MD游戏开发【十二】:伪3D地面,Pseudo-3D
  14. CGB2202-DAY02-IO低级流与高级流
  15. 2021清北学堂储备营Day1
  16. git版本管理软件——git储藏
  17. 让你的 Mac 用上最美的屏保,Aerial 使用教程
  18. meta camp+21春季PAT乙级反思
  19. GBase 8s 产品简介
  20. 史上最全程序员视频+电子书资源分享

热门文章

  1. 蓝桥杯真题 14省1-啤酒和饮料 啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。 我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。 注意:答案是一
  2. 6个月20万用户,我是如何在一片唱衰声中打造出爆款应用的?
  3. Request请求域
  4. u盘扫描并修复后文件消失了怎么办?2种方法帮助找回
  5. 速达软件开发版-程序升级
  6. java操作liunx命令,实现文件内容追加与删除
  7. 请简述gouraud光照模型_光照模型汇总
  8. vb.net 教程 10-2 Excel操作6 更改Excel单元格字体
  9. PTA 查询名字中含有“明”字的男生的学生姓名和班级分数 3
  10. QML类型:Item