当前位置: 首页 > news >正文

设计模式(四)原型模式

文章目录

  • 原型模式简介
  • 结构
  • UML图
  • 具体实现
  • 关于拷贝
    • 浅拷贝
    • 深拷贝
    • 实现深拷贝方法

原型模式简介

  • 原型模式是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象。
  • 工作原理:原型模式创建新的对象,其本质就是克隆,也就是 对象.clone()。

结构

  • Prototype:原型类,申明一个克隆自己的接口,Java语言中顶级类Object默认有clone();
  • ConcretePrototype:具体的原型类,实现一个克隆自己的操作。
  • Client:让一个原型对象克隆自己,从而创建一个新的对象。

UML图

在这里插入图片描述

具体实现

  • UML图
    在这里插入图片描述
  • 绵羊类(原型类)
package com.xxliao.pattern.creational.prototype.demo;/*** @author xxliao* @description: 绵羊类,实现Cloneable接口* @date 2024/5/24 13:22*/
public class Sheep implements Cloneable{private String name;private int age;private String color;private String address;public Sheep friend; // 对象public Sheep(String name, int age, String color, String address) {this.name = name;this.age = age;this.color = color;this.address = address;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "Sheep{" +"name='" + name + '\'' +", age=" + age +", color='" + color + '\'' +", address='" + address + '\'' +'}';}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
  • 测试客户端
package com.xxliao.pattern.creational.prototype.demo;/*** @author xxliao* @description: 设计模式 - 原型模式 -测试客户端* @date 2024/5/24 13:27*/
public class Client {public static void main(String[] args) throws CloneNotSupportedException {Sheep sheep = new Sheep("tom",1,"白色","内蒙");sheep.friend = new Sheep("timi",2,"黑色","宁夏");Sheep sheep1 = (Sheep) sheep.clone();Sheep sheep2 = (Sheep) sheep.clone();Sheep sheep3 = (Sheep) sheep.clone();Sheep sheep4 = (Sheep) sheep.clone();System.out.println("sheep1="+sheep1+"sheep1.friend="+sheep1.friend.hashCode());System.out.println("sheep2="+sheep2+"sheep2.friend="+sheep2.friend.hashCode());System.out.println("sheep3="+sheep3+"sheep3.friend="+sheep3.friend.hashCode());System.out.println("sheep4="+sheep4+"sheep4.friend="+sheep4.friend.hashCode());}
}

关于拷贝

浅拷贝

  • 对于数据类型是基本类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性复制一份给新的对象。
  • 对于数据类型是引用类型的成员变量,浅拷贝会进行引用传递,也就是将该成员变量的内存地址复制一份给新的对象。

深拷贝

  • 复制对象的所有基础数据类型的成员变量值,为所有引用数据类型的成员变量申请存储空间,并复制每一个引用数据类型变量所引用的对象。

实现深拷贝方法

实现深拷贝有两个方法:重写clone方法利用对象的序列化

  • 深拷贝实现
package com.xxliao.pattern.creational.prototype.deep_clone_demo;import java.io.*;/*** @author xxliao* @description: 深拷贝实现-重写clone方法* @date 2024/5/24 13:41*/public class DeepCloneable implements Cloneable,Serializable{private String name;private DeepCloneable friend;public String getName() {return name;}public void setName(String name) {this.name = name;}public DeepCloneable getFriend() {return friend;}public void setFriend(DeepCloneable friend) {this.friend = friend;}@Overridepublic String toString() {return "DeepCloneable{" +"name='" + name + '\'' +", friend=" + friend +'}';}/*** @description  重写clone方法 实现深拷贝* @author  xxliao* @date  2024/5/24 13:50*/@Overrideprotected Object clone() throws CloneNotSupportedException {Object deep = null;deep = super.clone();DeepCloneable deepCloneable = (DeepCloneable) deep;System.out.println(this);deepCloneable.friend = friend != null ? (DeepCloneable) friend.clone() : null;return deepCloneable;}/*** @description  利用对象的序列化实现深拷贝* @author  xxliao* @date  2024/5/24 13:50*/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);return ois.readObject();}catch (Exception e){e.printStackTrace();return null;}finally {try {bos.close();oos.close();bis.close();ois.close();} catch (IOException e) {e.printStackTrace();}}}
}
  • 测试客户端
package com.xxliao.pattern.creational.prototype.deep_clone_demo;/*** @author xxliao* @description: 深拷贝测试客户端* @date 2024/5/24 13:57*/public class Client {public static void main(String[] args) throws CloneNotSupportedException {DeepCloneable one = new DeepCloneable();one.setName("one");DeepCloneable two = new DeepCloneable();two.setName("two");one.setFriend(two);System.out.println(one);// 完成深拷贝 - 重写cloneDeepCloneable clone = (DeepCloneable) one.clone();System.out.println(clone);// 完成深拷贝 - 序列化DeepCloneable deepCloneable = (DeepCloneable) one.deepClone();System.out.println(deepCloneable);}
}

相关文章:

  • 线性代数|机器学习-P2 A的列向量空间
  • 如何解决Mac系统创建/home目录提示Read-Only filesystem(补充)?
  • Flutter 中的 SliverMainAxisGroup 小部件:全面指南
  • Flutter 中的 SliverOpacity 小部件:全面指南
  • MMPose-RTMO推理详解及部署实现(上)
  • 低代码开发平台(Low-code Development Platform)的模块组成部分
  • Hive操作
  • Python知识点4---循环语句
  • 【WP|6】WordPress 主题开发详解
  • IntelliJ IDEA / Android Studio 方法显示Git提交人
  • js 纯前端实现数组分页、列表模糊查询、将数组转成formdata格式传给接口
  • MongoDB CRUD操作:批量写操作
  • 2.1 OpenCV随手简记(二)
  • 学习笔记——网络参考模型——TCP/IP模型(物理层)
  • 常用的 Git 命令
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • JS字符串转数字方法总结
  • MYSQL 的 IF 函数
  • MySQL几个简单SQL的优化
  • RxJS: 简单入门
  • SOFAMosn配置模型
  • TypeScript迭代器
  • 浮动相关
  • 机器学习 vs. 深度学习
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 驱动程序原理
  • 手写双向链表LinkedList的几个常用功能
  • 微信开源mars源码分析1—上层samples分析
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ![CDATA[ ]] 是什么东东
  • #Linux(帮助手册)
  • (JS基础)String 类型
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)php新闻发布平台 毕业设计 141646
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (转)关于多人操作数据的处理策略
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .net程序集学习心得
  • .net中生成excel后调整宽度
  • [ C++ ] STL---string类的模拟实现
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [10] CUDA程序性能的提升 与 流
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [20180129]bash显示path环境变量.txt
  • [bzoj1038][ZJOI2008]瞭望塔
  • [BZOJ2850]巧克力王国
  • [C/C++]关于C++11中的std::move和std::forward
  • [HEOI2013]ALO
  • [hive] posexplode函数