【設計模式--創建型--原型模式】

設計模式--創建型--原型模式

    • 原型模式
      • 概述
      • 結構
      • 實現
      • 結果
    • 案例
      • 代碼
      • 結果
      • 使用場景
    • 擴展(深\淺克隆)
      • 淺克隆演示:
      • 結果:
      • 使用深克隆(利用對象流)
      • 結果

原型模式

概述

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

結構

原型模式包含如下角色

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

實現

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

  • 淺克隆:創建一個新對象,新對象的屬性和原來對象完全相同,對于非基本類型屬性,仍指向原有屬性所指向的對象的內存地址
  • 深克隆:創建一個新對象,屬性中引用的其他對象也會被克隆,不在指向原有對象地址。
    Java中的Object類中提供了clone()方法來實現淺克隆。
/*** 具體的原型類實現Cloneable接口  這里用Cloneable接口來當做抽象原型類*/
public class RealizeType implements Cloneable{public RealizeType(){System.out.println("使用構造器創建具體的原型對象");};/*** 重寫clone()方法* @return RealizeType*/@Overridepublic RealizeType clone() throws CloneNotSupportedException{System.out.println("clone具體原型對象成功");return (RealizeType) super.clone();}
}
public class Test01 {public static void main(String[] args) throws CloneNotSupportedException {// 創建一個原型對象RealizeType realizeType = new RealizeType();// 調用RealizeType中的clone方法進行對象的克隆RealizeType clone = realizeType.clone();System.out.println("原型對象和克隆對象是否是同一個對象?"+ (clone == realizeType));}
}

結果

![在這里插入圖片描述](https://img-blog.csdnimg.cn/direct/4978f97be7a246caa286f5d6f9bfb63b.png

案例

用原型模式生成"三好學生"獎狀
獎狀除了獲獎人信息不同,其他都相同,可以使用原型模式復制多個“三好學生獎狀”,然后修改學生信息即可

代碼

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 info(){System.out.println(name + "同學的獎狀");}
}
public class Test01 {public static void main(String[] args) throws CloneNotSupportedException {// 創建獎狀原型Citation citation = new Citation();citation.setName("張三");Citation clone = citation.clone();clone.setName("李四");citation.info();clone.info();}
}

結果

在這里插入圖片描述

  • 這里雖然是淺拷貝但是name屬性沒有改變,是因為name是String類型,如果是引用類型并且還是淺拷貝,那么原型對象中的name是改變的,下面是深、淺克隆演示。

使用場景

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

擴展(深\淺克隆)

這里將上面的name屬性放到一個student對象中,而Citation類中的Student屬性就是引用屬性

淺克隆演示:

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 info(){System.out.println(stu.getName() + "同學的獎狀");}
}
public class Student {private String name;public String getName(){return name;}public void setName(String name){this.name = name;}
}
public class Test01 {public static void main(String[] args) throws CloneNotSupportedException {// 創建獎狀原型Citation citation = new Citation();// 創建學生對象Student student = new Student();student.setName("張三");citation.setStu(student);citation.info();// 克隆Citation clone = citation.clone();// 重新設置學生姓名clone.getStu().setName("李四");citation.info();clone.info();}
}

結果:

在這里插入圖片描述

說明:原型對象和克隆出來的對象中的student對象是同一個對象,修改其中一個,另一個的值也會改變。
這就是淺克隆的效果,對具體原型類中的引用數據類型進行引用的復制。

使用深克隆(利用對象流)

克隆時先將原型對象寫入文件中,再讀取。

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 info(){System.out.println(stu.getName() + "同學的獎狀");}
}
public class Student implements Serializable {private String name;public String getName(){return name;}public void setName(String name){this.name = name;}
}
public class Test02 {public static void main(String[] args) throws Exception {// 創建獎狀原型Citation citation = new Citation();// 創建學生對象Student student = new Student();student.setName("張三");citation.setStu(student);citation.info();// 創建對象輸出流對象ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e:/a.txt"));// 寫對象oos.writeObject(citation);// 釋放oos.close();// 創建對象輸入流對象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e:/a.txt"));// 讀取對象Citation citation1 = (Citation) ois.readObject();ois.close();citation1.getStu().setName("李四");citation.info();citation1.info();}
}

結果

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212635.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212635.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212635.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Go簡單了解

0.一直很好奇,go是不是像傳說中的速度快,解決了多線程問題,快速進行了解了解,和java進行對比,他是怎么解決語言發展的問題的…,所有語言都是差不多的,只是熟練程度不同而已 1.go圖標是土撥鼠,2009發行 docker使用go,解決了并發問題 google facebook 騰訊 百度 七牛云 京東 小米…

Spring Cloud Gateway + Nacos + LoadBalancer實現企業級網關

1. Spring Cloud Gateway 整合Nacos、LoadBalancer 實現企業級網關 前置工作: 創建 SpringBoot 多模塊項目創建網關(gateway-service)、用戶(user-service)模塊用戶模塊添加 Nacos discovery 支持以及 Spring Web&am…

gitbash下載安裝

參考教程 零、下載 官網地址 2.43.0win64 鏈接:https://pan.baidu.com/s/16urs_nmky7j20-qNzUTTkg 提取碼:7jaq 一、安裝 圖標組件(Additional icons):選擇是否創建桌面快捷方式;桌面瀏覽(Win…

設計模式--命令模式的簡單例子

引入:以一個對數組的增刪改查為例。通過命令模式可以對數組進行增刪改查以及撤銷回滾。 一、基本概念 命令模式有多種分法,在本文中主要分為CommandMgr、Command、Receiver. CommandMgr主要用于控制命令執行等操作、Command為具體的命令、Receiver為命…

逸迅科技丁紅陽:三種能力幫助企業打造GBI “護城河”

大數據產業創新服務媒體 ——聚焦數據 改變商業 近日,由上海市經濟和信息化委員會、上海市科學技術委員會指導,數據猿與上海大數據聯盟聯合主辦的“2023企業數智化轉型升級發展論壇”在上海舉行。本次論壇以“釋放數字價值驅動智能升級”為主題&#xf…

piakachu越權漏洞

水平越權 首先打開這一關,在右側有一些提示,我們可以看到 然后我們隨便輸入一組信息即可,可以在url中看到這樣的字段 當我們嘗試在url中直接更換另一個用戶名時可以發現,直接切換到了另一個用戶的身份 垂直越權 這里可以看到右邊…

QML和C++交互中,實現C++中connect到qml的信號,再從qml發射信號傳遞數據給C++的一種方式

1.需求: 假設我們有一個需求,要求在用戶點擊列表中的項目時,不僅在控制臺上輸出項目的名稱,還要在C端進行一些處理。我們希望在C端能夠接收到用戶點擊的項目名稱,并進行相應的處理。 2.分析: 在這種情況…

Android 10.0 系統framework修改低電量關機值為2%

1.前言 在10.0的系統產品開發中,在系統關于低電量關機的值,每個平臺都不同,根據實際開發底層硬件的要求看實際情況來調整這個值, 所以需要分析相關的電量變化執行的代碼流程,來實現這個功能 2.系統framework修改低電量關機值為2%的核心類 frameworks\base\services\cor…

一文學會使用 PyInstaller 將 Python 腳本打包為 .exe 可執行文件

文章目錄 前言PyInstaller特點跨平臺支持自動依賴項處理單文件發布支持圖形用戶界面(GUI)和命令行界面(CLI)應用支持多種打包選項 基本用法常用參數其它參數 版本 & 環境實現步驟安裝 PyInstaller創建 Python 腳本使用 PyInst…

Strange-Towers-of-Hanoi

title: Strange Towers of Hanoi date: 2023-12-11 03:20:05 tags: 遞推 categories: 算法進階指南 題目大意 解出 n n n 個盒子 4 4 4 座塔的漢諾塔問題最少需要多少次? 思路 首先考慮 n n n 個盒子 3 3 3 座塔的經典漢諾塔問題,設 d [ n ] d[n] …

第三十章 控制到 XML 模式的映射 - Array of Classname

文章目錄 第三十章 控制到 XML 模式的映射 - Array of ClassnameArray of Classname 第三十章 控制到 XML 模式的映射 - Array of Classname Array of Classname 本部分顯示了從啟用 XML 的類生成的XML 架構的一部分,此時該類包含定義為類名數組的屬性。例如&…

【SpringBoot教程】SpringBoot 創建定時任務(配合數據庫動態執行)

作者簡介:大家好,我是擼代碼的羊駝,前阿里巴巴架構師,現某互聯網公司CTO 聯系v:sulny_ann(17362204968),加我進群,大家一起學習,一起進步,一起對抗…

transformer模型結構|李宏毅機器學習21年

來源:https://www.bilibili.com/video/BV1Bb4y1L7FT?p4&vd_sourcef66cebc7ed6819c67fca9b4fa3785d39 文章目錄 概述seq2seqtransformerEncoderDecoderAutoregressive(AT)self-attention與masked-self attentionmodel如何決定輸出的長度…

【親測有效】支持橫豎屏 微信小程序video禁止進度條拖動,微信小程序遮罩進度條,

背景&#xff1a;部分課程禁止客戶拖動視頻進度條直至播放結束 紅色是遮罩區域遮罩區域 實際遮罩效果&#xff08;有一個很淺的陰影區域&#xff09; 實現代碼 .wxml文件 <video enable-progress-gesture"false" ><cover-view class"cover">…

基于深度學習的yolov7植物病蟲害識別及防治系統

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介簡介YOLOv7 系統特性工作流程 二、功能三、系統四. 總結 一項目簡介 # YOLOv7植物病蟲害識別及防治系統介紹 簡介 該系統基于深度學習技術&#xff0c;采…

Seata配置

參考教程 seata 分布式事務的環境搭建與使用 Seata 1.4.0 nacos配置和使用&#xff0c;超詳細 Seata 1.4.2 的安裝 Nacos的配置和使用 官網下載地址 本文以v1.4.1為例 1.數據庫及表的創建 創建seata數據庫&#xff0c;創建以下表&#xff08;右鍵連接-》新建數據庫seata-》…

kubeadm搭建1.20.7版本k8s

資源 服務器名稱ip地址服務master1&#xff08;2C/4G&#xff0c;cpu核心數要求大于2&#xff09;192.168.100.10docker、kubeadm、kubelet、kubectl、flannelnode01&#xff08;2C/2G&#xff09;192.168.100.30docker、kubeadm、kubelet、kubectl、flannelnode02&#xff08…

windows系統proteus中Ardunio Mega 2560和虛擬機上Ubuntu系統CuteCom進行串口通信

在文章利用proteus實現串口助手和arduino Mega 2560的串口通信-CSDN博客 中&#xff0c;實現了windows系統的proteus中Ardunio Mega 2560和SSCOM通過虛擬串口進行通信。虛擬串口的連接示意圖如下圖所示。 在文章windows系統和虛擬機上ubuntu系統通過虛擬串口進行通信-CSDN博客…

3DMAX關于顯示驅動問題的解決方法大全

3DMAX與顯卡驅動有關的問題主要有以下幾種情況&#xff1a; 1.3DMAX啟動彈出這樣的界面&#xff1a; 2.主工具欄按鈕不顯示&#xff0c;或者鼠標移上去才顯示&#xff08;刷新問題&#xff09;。 3&#xff0e;視口菜單不顯示或顯示不全。 問題分析&#xff1a; 首先&#x…

安全基礎從0開始

文章目錄 常見名詞小實戰 網站搭建小實戰抓包模擬器狀態碼返回值網站搭建WEB應用安全漏洞 數據包&封包&信息收集**參考點** 常見名詞 前后端&#xff0c;POC/EXP&#xff0c;Payload/Shellcode&#xff0c;后門/Webshell&#xff0c;木馬/病毒&#xff0c; 反彈&…