首页
统计
关于
Search
1
Sealos3.0离线部署K8s集群
1,085 阅读
2
类的加载
742 阅读
3
Spring Cloud OAuth2.0
726 阅读
4
SpringBoot自动装配原理
691 阅读
5
集合不安全问题
586 阅读
笔记
Java
多线程
注解和反射
JVM
JUC
设计模式
Mybatis
Spring
SpringMVC
SpringBoot
MyBatis-Plus
Elastic Search
微服务
Dubbo
Zookeeper
SpringCloud
Nacos
Sentinel
数据库
MySQL
Oracle
PostgreSQL
Redis
MongoDB
工作流
Activiti7
Camunda
消息队列
RabbitMQ
前端
HTML5
CSS
CSS3
JavaScript
jQuery
Vue2
Vue3
Linux
容器
Docker
Kubernetes
Python
FastApi
登录
Search
标签搜索
Java
CSS
mysql
RabbitMQ
JavaScript
Redis
JVM
Mybatis-Plus
Camunda
多线程
CSS3
Python
Spring Cloud
注解和反射
Activiti
工作流
SpringBoot
Mybatis
Spring
html5
蘇阿細
累计撰写
389
篇文章
累计收到
4
条评论
首页
栏目
笔记
Java
多线程
注解和反射
JVM
JUC
设计模式
Mybatis
Spring
SpringMVC
SpringBoot
MyBatis-Plus
Elastic Search
微服务
Dubbo
Zookeeper
SpringCloud
Nacos
Sentinel
数据库
MySQL
Oracle
PostgreSQL
Redis
MongoDB
工作流
Activiti7
Camunda
消息队列
RabbitMQ
前端
HTML5
CSS
CSS3
JavaScript
jQuery
Vue2
Vue3
Linux
容器
Docker
Kubernetes
Python
FastApi
页面
统计
关于
搜索到
1
篇与
的结果
2022-08-30
创建者模式-原型模式
(1)概述用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象(2)结构抽象原型类:规定了具体原型对象必须实现的 clone() 方法具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象访问类:使用具体原型类中的 clone() 方法来复制新的对象接口类图:(3)实现原型模式的克隆分为浅克隆和深克隆:浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型,仍指向原有属性所指向的对象的内存地址深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,且不再指向原有对象地址Java中 Object 类提供了 clone() 方法来实现浅克隆,Cloneable 接口是上面类图中的抽象原型类,而实现了 Cloneable 接口的子实现类就是具体的原型类。原型类public class Realizetype implements Cloneable { public Realizetype() { System.out.println("具体原型对象创建完成"); } @Override public Realizetype clone() throws CloneNotSupportedException { System.out.println("具体原型复制成功"); return (Realizetype) super.clone(); } }测试public class Client { public static void main(String[] args) throws CloneNotSupportedException { //创建原型对象 Realizetype realizetype = new Realizetype(); //调用clone方法进行对象的克隆 Realizetype realizetype1 = realizetype.clone(); //具体原型对象创建完成 //具体原型复制成功 //false System.out.println(realizetype == realizetype1); } }(4)案例以学校发放“三好学生”奖状为例public class Citation implements Cloneable { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void show() { System.out.println(name + "同学,在本学年表现优秀,被评为“三好学生”,特发此状,以资鼓励!"); } @Override public Citation clone() throws CloneNotSupportedException { return (Citation) super.clone(); } }public class CitationTest { public static void main(String[] args) throws CloneNotSupportedException { //创建原型对象 Citation citation = new Citation(); //复制奖状 Citation citation1 = citation.clone(); citation.setName("孙笑川"); citation1.setName("药水哥"); //展示奖状 citation.show(); citation1.show(); } }(5)使用场景对象的创建非常复杂性能和安全要求较高(6)深克隆将奖状案例中的 name 属性修改为 Student 复杂对象属性public class CitationTest { public static void main(String[] args) throws CloneNotSupportedException { //创建原型对象 Citation citation = new Citation(); //创建学生 Student student = new Student(); student.setName("孙笑川"); citation.setStudent(student); //复制奖状 Citation citation1 = citation.clone(); citation1.getStudent().setName("药水哥"); //展示奖状 citation.show(); citation1.show(); //药水哥同学,在本学年表现优秀,被评为“三好学生”,特发此状,以资鼓励! //药水哥同学,在本学年表现优秀,被评为“三好学生”,特发此状,以资鼓励! } }存在的问题:使用浅克隆时,克隆出来的对象属性中的 student1 和第一次创建的 student 是同一个对象,此时 setName 方法设置的值是同一个改进:(使用对象流)public class CitationTest { public static void main(String[] args) throws Exception { //创建原型对象 Citation citation = new Citation(); //创建学生 Student student = new Student(); student.setName("孙笑川"); citation.setStudent(student); //创建对象输出流 ObjectOutputStream oos = new ObjectOutputStream(Files.newOutputStream(Paths.get("D:/citation.txt"))); //写对象 oos.writeObject(citation); //释放资源 oos.close(); //创建对象 ObjectInputStream ois = new ObjectInputStream(Files.newInputStream(Paths.get("D:/citation.txt"))); Citation citation1 = (Citation) ois.readObject(); ois.close(); citation1.getStudent().setName("药水哥"); citation.show(); citation1.show(); //孙笑川同学,在本学年表现优秀,被评为“三好学生”,特发此状,以资鼓励! //药水哥同学,在本学年表现优秀,被评为“三好学生”,特发此状,以资鼓励! } }
2022年08月30日
36 阅读
0 评论
0 点赞