日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

原型模式——浅克隆和深克隆

發布時間:2025/4/16 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 原型模式——浅克隆和深克隆 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述

用一個已經創建的實例作為原型,通過復制該原型對象來創建一個和原型對象相同的新對象。

?結構

原型模式包含如下角色:

  • 抽象原型類:規定了具體原型對象必須實現的的 clone() 方法。
  • 具體原型類:實現抽象原型類的 clone() 方法,它是可被復制的對象。
  • 訪問類:使用具體原型類中的 clone() 方法來復制新的對象。

接口類圖如下:

實現

原型模式的克隆分為淺克隆和深克隆

淺克隆:創建一個新對象,新對象的屬性和原來對象完全相同,對于非基本類型屬性,仍指向原有屬性所指向的對象的內存地址。

深克隆:創建一個新對象,屬性中引用的其他對象也會被克隆,不再指向原有對象地址。

Java中的Object類中提供了?clone()?方法來實現淺克隆

Cloneable 接口是上面的類圖中的抽象原型類,而實現了Cloneable接口的子實現類就是具體的原型類。

代碼如下:

Realizetype(具體的原型類):

Realizetype.java

package com.itheima.pattern.prototype.demo;/*** @version v1.0* @ClassName: Realizetype* @Description: TODO(一句話描述該類的功能)* @Author: dym*/ public class Realizetype implements Cloneable {public Realizetype() {System.out.println("具體的原型對象創建完成!");}@Overridepublic Realizetype clone() throws CloneNotSupportedException {System.out.println("具體原型復制成功!");return (Realizetype) super.clone();} }

client.java

package com.itheima.pattern.prototype.demo;/*** @version v1.0* @ClassName: client* @Description: TODO(一句話描述該類的功能)* @Author: dym*/ public class client {public static void main(String[] args) throws CloneNotSupportedException {//創建一個原型類對象Realizetype realizetype = new Realizetype();//調用Realizetype類中的clone方法進行對象的克隆Realizetype clone = realizetype.clone();System.out.println("原型對象和克隆出來的是否是同一個對象?" + (realizetype == clone));} }



案例

用原型模式生成“三好學生”獎狀

同一學校的“三好學生”獎狀除了獲獎人姓名不同,其他都相同,

可以使用原型模式復制多個“三好學生”獎狀出來,然后在修改獎狀上的名字即可。

類圖如下:

Citation.java

package com.itheima.pattern.prototype.test;/*** @version v1.0* @ClassName: Citation* @Description: TODO(一句話描述該類的功能)* @Author: dym*/ public class Citation implements Cloneable {//三好學生上的姓名private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic Citation clone() throws CloneNotSupportedException {return (Citation) super.clone();}public void show() {System.out.println(name + "同學:在2020學年第一學期中表現優秀,被評為三好學生。特發此狀!");} }

CitaionTest.java

package com.itheima.pattern.prototype.test;/*** @version v1.0* @ClassName: CitaionTest* @Description: TODO(一句話描述該類的功能)* @Author: dym*/ public class CitaionTest {public static void main(String[] args) throws CloneNotSupportedException {Citation c1 = new Citation();c1.setName("張三");//復制獎狀Citation c2 = c1.clone();//將獎狀的名字修改李四c2.setName("李四");c1.show();c2.show();} }



使用場景

  • 對象的創建非常復雜,可以使用原型模式快捷的創建對象。
  • 性能和安全要求比較高。


擴展(深克隆)

將上面的“三好學生”獎狀的案例中Citation類的name屬性修改為Student類型的屬性。

淺克隆

代碼如下:

Student.java

package com.itheima.pattern.prototype.test;/*** @version v1.0* @ClassName: Student* @Description: TODO(一句話描述該類的功能)* @Author: dym*/ public class Student {//學生的姓名private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +'}';} }

Citation.java

package com.itheima.pattern.prototype.test;/*** @version v1.0* @ClassName: Citation* @Description: TODO(一句話描述該類的功能)* @Author: dym*/ public class Citation implements Cloneable {private Student stu;public Student getStu() {return stu;}public void setStu(Student stu) {this.stu = stu;}@Overridepublic Citation clone() throws CloneNotSupportedException {return (Citation) super.clone();}public void show() {System.out.println(stu.getName() + "同學:在2020學年第一學期中表現優秀,被評為三好學生。特發此狀!");} }

CitaionTest.java

package com.itheima.pattern.prototype.test;/*** @version v1.0* @ClassName: CitaionTest* @Description: TODO(一句話描述該類的功能)* @Author: dym*/ public class CitaionTest {public static void main(String[] args) throws CloneNotSupportedException {//1,創建原型對象Citation citation = new Citation();//創建張三學生對象Student stu = new Student();stu.setName("張三");citation.setStu(stu);//2,克隆獎狀對象Citation citation1 = citation.clone();Student stu1 = citation1.getStu();stu1.setName("李四");//3,調用show方法展示citation.show();citation1.show();} }



說明:

stu對象和stu1對象是同一個對象,就會產生將stu1對象中name屬性值改為“李四”,兩個Citation(獎狀)對象中顯示的都是李四。

這就是淺克隆的效果,對具體原型類(Citation)中的引用類型的屬性進行引用的復制。

這種情況需要使用深克隆,而進行深克隆需要使用對象流。代碼如下:

Student.java

package com.itheima.pattern.prototype.test1;import java.io.Serializable;/*** @version v1.0* @ClassName: Student* @Description: TODO(一句話描述該類的功能)* @Author: dym*/ public class Student implements Serializable {//學生的姓名private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +'}';} }

Citation.java

package com.itheima.pattern.prototype.test1;import java.io.Serializable;/*** @version v1.0* @ClassName: Citation* @Description: TODO(一句話描述該類的功能)* @Author: dym*/ public class Citation implements Cloneable, Serializable {private Student stu;public Student getStu() {return stu;}public void setStu(Student stu) {this.stu = stu;}@Overridepublic Citation clone() throws CloneNotSupportedException {return (Citation) super.clone();}public void show() {System.out.println(stu.getName() + "同學:在2020學年第一學期中表現優秀,被評為三好學生。特發此狀!");} }

CitaionTest.java

package com.itheima.pattern.prototype.test1;import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream;/*** @version v1.0* @ClassName: CitaionTest* @Description: TODO(一句話描述該類的功能)* @Author: dym*/ public class CitaionTest {public static void main(String[] args) throws Exception {//1,創建原型對象Citation citation = new Citation();//創建張三學生對象Student stu = new Student();stu.setName("張三");citation.setStu(stu);//創建對象輸出流對象ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\iadai\\Desktop\\a.txt"));//寫對象oos.writeObject(citation);//釋放資源oos.close();//創建對象輸入流對象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\iadai\\Desktop\\a.txt"));//讀取對象Citation citation1 = (Citation) ois.readObject();//釋放資源ois.close();Student stu1 = citation1.getStu();stu1.setName("李四");citation.show();citation1.show();} }



注意:Citation類和Student類必須實現Serializable接口,否則會拋NotSerializableException異常。

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的原型模式——浅克隆和深克隆的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。