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

米拓建设网站深圳免费模板建站

米拓建设网站,深圳免费模板建站,枞阳做网站,广州番禺服装网站建设文章目录 1.传统方式解决克隆羊问题1.问题描述2.类图3.目录结构4.代码实现1.Sheep.java2.Client.java 5.优缺点分析 2.原型模式解决克隆羊问题(浅拷贝)1.基本介绍2.类图3.目录结构4.代码实现1.Sheep.java 实现Cloneable接口的clone方法,使用原…

文章目录

    • 1.传统方式解决克隆羊问题
        • 1.问题描述
        • 2.类图
        • 3.目录结构
        • 4.代码实现
          • 1.Sheep.java
          • 2.Client.java
        • 5.优缺点分析
    • 2.原型模式解决克隆羊问题(浅拷贝)
        • 1.基本介绍
        • 2.类图
        • 3.目录结构
        • 4.代码实现
          • 1.Sheep.java 实现Cloneable接口的clone方法,使用原型模式来实现克隆
          • 2.Client.java
    • 3.原型模式在Spring框架中的源码分析
        • 1.基本介绍
        • 2.解释
    • 4.深拷贝
        • 1.默认的原型模式为浅拷贝
          • 1.在Sheep.java中添加一个引用类型的数组
          • 2.在Client.java测试克隆的羊和原来的羊的属性是不是一个数组
          • 3.结果表明,默认的原型模式克隆出来的对象,会将引用类型的属性指向原型的属性,共享内存空间,也就是浅拷贝
        • 2.浅拷贝与深拷贝
          • 1.浅拷贝
          • 2.深拷贝
    • 5.实现深拷贝的两种方式
        • 1.重写clone方法实现深拷贝
          • 1.DeepCloneableTarget.java
          • 2.Client.java
          • 3.结果
        • 2.对象序列化实现深拷贝(推荐)
          • 1.DeepCloneableTarget.java
          • 2.Client.java
          • 3.结果
        • 3.原型模式的注意事项

1.传统方式解决克隆羊问题

1.问题描述

image-20240528191716468

2.类图

image-20240528193030415

3.目录结构

image-20240528193057530

4.代码实现
1.Sheep.java
package com.sun.tradition;/*** Description:* @Author sun* @Create 2024/5/28 19:26* @Version 1.0*/
public class Sheep {private String name;private int age;private String color;public Sheep(String name, int age, String color) {this.name = name;this.age = age;this.color = color;}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;}@Overridepublic String toString() {return "Sheep{" +"name='" + name + '\'' +", age=" + age +", color='" + color + '\'' +'}';}
}
2.Client.java
package com.sun.tradition;/*** Description: 使用传统的方式复制十只羊* @Author sun* @Create 2024/5/28 19:26* @Version 1.0*/
public class Client {public static void main(String[] args) {Sheep sheep = new Sheep("tom", 1, "白色");Sheep sheep1 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());Sheep sheep2 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());Sheep sheep3 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());Sheep sheep4 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());Sheep sheep5 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());Sheep sheep6 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());Sheep sheep7 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());Sheep sheep8 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());Sheep sheep9 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());System.out.println(sheep);}
}
5.优缺点分析

image-20240528193325229

2.原型模式解决克隆羊问题(浅拷贝)

1.基本介绍

image-20240528193514436

2.类图

image-20240528193707328

3.目录结构

image-20240528194939568

4.代码实现
1.Sheep.java 实现Cloneable接口的clone方法,使用原型模式来实现克隆
package com.sun.improve;/*** Description: 实现Cloneable接口的clone方法,使用原型模式来实现克隆* @Author sun* @Create 2024/5/28 19:26* @Version 1.0*/
public class Sheep implements Cloneable{private String name;private int age;private String color;public Sheep(String name, int age, String color) {this.name = name;this.age = age;this.color = color;}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;}@Overridepublic String toString() {return "Sheep{" +"name='" + name + '\'' +", age=" + age +", color='" + color + '\'' +'}';}@Overrideprotected Sheep clone() throws CloneNotSupportedException {return (Sheep) super.clone();}
}
2.Client.java
package com.sun.improve;/*** Description: 原型模式的客户端* @Author sun* @Create 2024/5/28 19:43* @Version 1.0*/
public class Client {public static void main(String[] args) throws CloneNotSupportedException {Sheep sheep = new Sheep("tom", 1, "白色");Sheep clone = sheep.clone();Sheep clon2 = sheep.clone();Sheep clon3 = sheep.clone();Sheep clon4 = sheep.clone();System.out.println(clone);}
}

3.原型模式在Spring框架中的源码分析

1.基本介绍

image-20240528195301792

2.解释
  • 在Spring中配置一个bean的时候,有一个scope属性可以选择配置prototype(原型模式)
  • 当配置了这个参数,每次getBean的时候就相当于使用原型模式创建了一个新的对象,然后将原对象的属性浅拷贝到这个新的对象

4.深拷贝

1.默认的原型模式为浅拷贝
1.在Sheep.java中添加一个引用类型的数组

image-20240528200126230

2.在Client.java测试克隆的羊和原来的羊的属性是不是一个数组

image-20240528200435305

image-20240528200444586

3.结果表明,默认的原型模式克隆出来的对象,会将引用类型的属性指向原型的属性,共享内存空间,也就是浅拷贝
2.浅拷贝与深拷贝
1.浅拷贝

image-20240528200712243

2.深拷贝

image-20240528200759247

5.实现深拷贝的两种方式

1.重写clone方法实现深拷贝
1.DeepCloneableTarget.java
package com.sun.deepcopy01;import java.io.Serializable;/*** Description: 要被深拷贝的对象,内部含有引用类型* @Author sun* @Create 2024/5/28 20:20* @Version 1.0*/
public class DeepCloneableTarget implements Serializable, Cloneable {public static final long serialVersionUID = 1L;private String name;private int[] arr; // 引用类型需要手动拷贝一份public DeepCloneableTarget(String name, int[] arr) {this.name = name;this.arr = arr;}/*** 重写克隆方法,使当前对象可以完成深拷贝* @return* @throws CloneNotSupportedException*/@Overrideprotected DeepCloneableTarget clone() throws CloneNotSupportedException {// 首先调用一次父类的克隆方法,浅拷贝一份当前对象DeepCloneableTarget clone = (DeepCloneableTarget) super.clone();// 目前的clone对象的arr是浅拷贝,所以需要将其手动拷贝一份int[] copyArr = new int[arr.length];if (arr != null) {int j = 0;for (int i : arr) {copyArr[j ++] = i;}}// 重新设置一下拷贝后的数组clone.arr = copyArr;return clone;}public int[] getArr() {return arr;}
}
2.Client.java
package com.sun.deepcopy01;import java.util.Arrays;/*** Description: 原型模式的客户端* @Author sun* @Create 2024/5/28 19:43* @Version 1.0*/
public class Client {public static void main(String[] args) throws CloneNotSupportedException {DeepCloneableTarget deepCloneableTarget = new DeepCloneableTarget("sunxiansheng", new int[]{1, 2, 3});DeepCloneableTarget clone = deepCloneableTarget.clone();// 测试深拷贝System.out.println(deepCloneableTarget.getArr() == clone.getArr());System.out.println(Arrays.toString(deepCloneableTarget.getArr()));System.out.println(Arrays.toString(clone.getArr()));}
}
3.结果

image-20240528203539042

2.对象序列化实现深拷贝(推荐)
1.DeepCloneableTarget.java
package com.sun.deepcopy02;import java.io.*;/*** Description: 要被深拷贝的对象,内部含有引用类型* @Author sun* @Create 2024/5/28 20:20* @Version 1.0*/
public class DeepCloneableTarget implements Serializable, Cloneable {public static final long serialVersionUID = 1L;private String name;private int[] arr;public DeepCloneableTarget(String name, int[] arr) {this.name = name;this.arr = arr;}public int[] getArr() {return arr;}// 通过对象的序列化实现深拷贝public DeepCloneableTarget deepClone() {// 创建流对象ByteArrayOutputStream byteArrayOutputStream = null;ObjectOutputStream objectOutputStream = null;ByteArrayInputStream byteArrayInputStream = null;ObjectInputStream objectInputStream = null;try {// 序列化byteArrayOutputStream = new ByteArrayOutputStream();// 将字节数组输出流转换为对象输出流objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);// 将当前的对象以对象流的方式输出objectOutputStream.writeObject(this);// 反序列化byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());objectInputStream = new ObjectInputStream(byteArrayInputStream);DeepCloneableTarget copyObject = (DeepCloneableTarget) objectInputStream.readObject();return copyObject;} catch (Exception e) {e.printStackTrace();return null;} finally {// 关闭流try {if (byteArrayOutputStream != null) {byteArrayOutputStream.close();}if (objectOutputStream != null) {objectOutputStream.close();}if (byteArrayInputStream != null) {byteArrayInputStream.close();}if (objectInputStream != null) {objectInputStream.close();}} catch (IOException e) {e.printStackTrace();}}}
}
2.Client.java
package com.sun.deepcopy02;import java.util.Arrays;/*** Description: 原型模式的客户端* @Author sun* @Create 2024/5/28 19:43* @Version 1.0*/
public class Client {public static void main(String[] args) throws CloneNotSupportedException {DeepCloneableTarget deepCloneableTarget = new DeepCloneableTarget("sunxiansheng", new int[]{1, 2, 3});DeepCloneableTarget clone = deepCloneableTarget.deepClone();// 测试深拷贝System.out.println(deepCloneableTarget.getArr() == clone.getArr());System.out.println(Arrays.toString(deepCloneableTarget.getArr()));System.out.println(Arrays.toString(clone.getArr()));}
}
3.结果

image-20240528205755950

3.原型模式的注意事项

image-20240528210201837

http://www.dtcms.com/a/588313.html

相关文章:

  • 代理建设网站wordpress设置ssl网站打不开
  • 莞城网站制作个人网站谢谢
  • 汕头网站开发找哪里自己可以做网站空间吗
  • 连江厦门网站建设公司镇江网站开发公司
  • 筑巢网络官方网站asp网站安装教程
  • 中小企业服务中心网站建设建立网络专题网站架构
  • 垂直网站做益智类问答室内设计师简历内容
  • 成都私人视频网站制作平台平面设计培训大概费用
  • 中山建站服务四个字广告公司名字
  • 哪些网站用黑体做的简洁物流网站模板
  • 企业官方网站管理制度电子商务网站设计说明
  • 长沙网站建设技术湖南营销型网站建设 搜搜磐石网络
  • 门户网站首页模板下载wordpress函数手册
  • 慈溪企业排名网站网站快照不更新原因
  • 如何做淘宝店网站wordpress怎么二次开
  • 如何用asp做网站的登录界面旅游网站开发费用
  • 白云区建材网站建设推广一件代发货源网
  • 网站设计论文结束语.net 微信网站开发
  • 网站建设的现状上海十大服装外贸公司
  • wdcp 网站无法访问免费工程信息网
  • 商丘做网站一般多少钱苏州市住房和城乡建设局官方网站
  • 中国空间站拒绝10国名单建一个全部由自己控制的网站需要多少钱
  • 视觉设计网站推荐免费观看电视剧网站
  • 网站服务器建设嘉兴网站建设科技有限公司
  • 在线心理健康网站建设进了网站的后台系统 怎么改公司的网站
  • 网站建设维保合同范本电脑版网页游戏
  • 北京上海网站建设公司哪家好免费十八种禁用网站游戏
  • wordpress网站更改主题信息建设谷歌公司网站费用
  • qq空间认证的网站后台根目录wordpress 模板 旅游
  • PHP视频类网站应该怎么做域名注册查询工具