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

原型設計模式

    • 一 .簡介
    • 二. 案例
    • 三. 補充知識

前言
這是我在這個網站整理的筆記,有錯誤的地方請指出,關注我,接下來還會持續更新。
作者:神的孩子都在歌唱

一 .簡介

原型模式提供了一種機制,可以將原始對象復制到新對象,然后根據我們的需要進行修改。原型設計模式使用java克隆來復制對象。

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

深拷貝(Deep Copy)和淺拷貝(Shallow Copy)是指在進行對象復制時所產生的兩種不同結果。

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

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

Java中的Object類中提供了 clone() 方法來實現淺克隆。 Cloneable 接口是上面的類圖中的抽象原型類,而實現了Cloneable接口的子實現類就是具體的原型類。

image-20240203225539994

二. 案例

通過一個例子就很容易理解原型設計模式。假設我們有一個從數據庫加載數據對象。現在我們需要在程序中多次修改這些數據,因此使用通過new 一個新的對象,并再次從數據庫加載所有數據并不是一個好主意。更好的方法是將現有對象克隆新對象中,然后進行數據操作。原型設計模式其實就是需要你確保正在拷貝的對象應該提供拷貝功能。它不應該由任何其他類完成。然而,是否使用對象屬性的淺拷貝深拷貝 取決于 需求及其設計決策

以下是代碼案例:

這里我定義了一個籃球類,通過重新實現clone方法來實現深拷貝

/*** @author chenyunzhi*/
public class Ball implements Cloneable{private final List<String> ballList;public Ball(){ballList = new ArrayList<>();}public Ball(List<String> ballList){this.ballList=ballList;}/*** 模擬從數據庫中拿數據*/public void loadData(){ballList.add("basketball");ballList.add("soccer");}public List<String> getBallList() {return ballList;}@Overridepublic Ball clone() throws CloneNotSupportedException {return new Ball(new ArrayList<>(this.getBallList()));}}

然后我寫了一個測試類方便測試,這里我new了一個 ball 對象,然后對ball對象進行拷貝,對拷貝的對象進行了增添刪除他們相互之間都不影響

/*** @author chenyunzhi*/
public class PrototypePatternTest {public static void main(String[] args) throws CloneNotSupportedException {Ball ball = new Ball();ball.loadData();Ball ballNew =ball.clone();Ball ballNew1 = ball.clone();List<String> list = ballNew.getBallList();list.add("tennis");List<String> list1 = ballNew1.getBallList();list1.remove("basketball");// 輸入修改后的球類列表System.out.println("ball List: "+ball.getBallList());System.out.println("ballNew List: "+list);System.out.println("ballNew1 List: "+list1);System.out.println("ball List: "+ball.getBallList());}}

測試結果

image-20240203232509211

結論:如果沒有提供對象克隆,我們每次都必須調用數據庫來獲取球類列表。然后進行那些耗費資源和時間的操作。這就是java中原型設計模式的全部內容。

三. 補充知識

問題: 為什么淺拷貝拷貝的對象修改了某個String類型的值被拷貝對象的值沒有變化?

在Java類庫中,所有基本類型的包裝類都是不可變類,例如Integer、Float等。

不可變類(Immutable Class) 在初始化后的所有信息不能被修改。而更改String成員的值相當于在堆中新建一個String引用,舊的String常量引用仍然存在于堆中,只不過還沒回收,從而讓兩個引用不相等。這時你以為String是被克隆,但造成其不相等的原因其實是賦值。

作者:神的孩子都在歌唱
本人博客:https://blog.csdn.net/weixin_46654114
轉載說明:務必注明來源,附帶本人博客連接。

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

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

相關文章

[TCP] TCP/IP 基礎知識詞典(2)

我想統計一下&#xff0c;TCP/IP 尤其是TCP協議&#xff0c;能搜到的常見的問題&#xff0c;整理起來&#xff0c;關鍵詞添加在目錄中&#xff0c;便于以后查閱。 目前預計整理共3篇&#xff1a; [TCP] TCP/IP 基礎知識問答 &#xff1a;基礎知識 [TCP] TCP/IP 基礎知識問答&…

游戲平臺如何定制開發?

隨著科技的飛速發展和互聯網的普及&#xff0c;游戲平臺已成為人們休閑娛樂的重要選擇。為了滿足用戶多樣化的需求&#xff0c;游戲平臺的定制開發顯得尤為重要。本文將探討游戲平臺定制開發的過程、關鍵要素以及注意事項&#xff0c;為有志于涉足此領域的開發者提供參考。 一、…

python opencv繪制圖像輪廓

目錄 一:查找繪制輪廓 二:計算圖像的矩特征 三:計算Hu矩

ApexRBp在線粒子傳感器在電動汽車電池制造的應用

電動汽車電池的崛起與顆粒污染的挑戰 隨著電動汽車&#xff08;EV&#xff09;市場的迅速擴張&#xff0c;對高性能鋰離子電池的需求也急劇增加。這些電池不僅是EV的心臟&#xff0c;更是推動其前行的核心動力。然而&#xff0c;在電池制造的每一個環節&#xff0c;都需要對多…

【Python筆記-設計模式】適配器模式

一、說明 適配器模式是一種結構型模式&#xff0c;它使接口不兼容的對象能夠相互合作 (一) 解決問題 主要解決接口不兼容問題 (二) 使用場景 當系統需要使用現有的類&#xff0c;但類的接口不符合需求時當需要一個統一的輸出接口&#xff0c;但輸入類型不可預知時當需要創…

查詢數據庫的編碼集Oracle,MySQL

1、查詢數據庫的編碼集Oracle,MySQL 1.1、oracle select * from v$nls_parameters where parameterNLS_CHARACTERSET; 查詢版本&#xff1a;SELECT * FROM v$version 2、MySQL編碼集 SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SC…

【了解機器學習的定義與發展歷程】

曾夢想執劍走天涯&#xff0c;我是程序猿【AK】 目錄 簡述概要知識圖譜 簡述概要 了解機器學習的定義與發展歷程 知識圖譜 機器學習&#xff08;Machine Learning&#xff0c;ML&#xff09;是一門跨學科的學科&#xff0c;它使用計算機模擬或實現人類學習行為&#xff0c;通…

路由器的端口映射如何設置?

路由器的端口映射設置是網絡連接中常用的配置功能&#xff0c;通過將外部網絡訪問請求映射到內部設備&#xff0c;實現局域網內設備的遠程訪問。本文將介紹如何進行路由器的端口映射設置&#xff0c;并以【天聯】組網產品為例進行說明。 【天聯】組網產品介紹 【天聯】組網是一…

css3d制作正方體

使用css3d技術 &#xff0c;制作一個可以動態動畫的正方體模型 效果圖&#xff1a; 代碼如下&#xff1a; <!DOCTYPE html> <html> <head><style>/* 設置高度寬度100%并且左右居中、上下居中 */html,body {width: 100%;height: 100%;display: flex…

RENISHAW雷尼紹雙讀數頭系統應用分享

在精密回轉運動控制中&#xff0c;大多數場合都會對系統的回轉定位精度有嚴格的要求&#xff0c;RENISHAW雷尼紹圓光柵系統&#xff08;RESM增量和RESA絕對值&#xff09;對于回轉角度的反饋測量方案能有效的解決運動控制對回轉精度的需求。但是配置單個讀數頭的圓光柵系統的精…

C#最優隊列最小堆小頂堆大頂堆小根堆大根堆PriorityQueue的使用

最優隊列有多種叫法&#xff0c;什么小根堆&#xff0c;大根堆&#xff0c;小頂堆&#xff0c;大頂堆。 隊列分多種&#xff0c;線性隊列&#xff08;簡單隊列&#xff09;&#xff0c;循環隊列&#xff0c;最優隊列等等。 最優隊列&#xff0c;可以看作堆疊箱子&#xff0c;…

3分鐘看懂設計模式01:策略模式

一、什么是策略模式 定義一些列算法類&#xff0c;將每一個算法封裝起來&#xff0c;并讓它們可以互相替換。 策略模式讓算法獨立于使用它的客戶而變化&#xff0c;是一種對象行為型模式。 以上是策略模式的一般定義&#xff0c;屬于是課本內容。 在沒有真正理解策略模式之…

簡單幾步通過DD工具把云服務器系統Linux改為windows

簡單幾部通過DD安裝其他系統&#xff0c;當服務器的web控制臺沒有我們要裝的系統&#xff0c;就需要通過DD&#xff08;Linux磁盤&#xff09;工具來更改系統&#xff0c;&#xff08;已知支持KVM系統&#xff09; 本文如何簡單的更換系統&#xff0c;不通過web控制臺來更換&a…

mysql開啟遠程訪問并開啟3306端口

登陸mysql mysql -u root -p設置允許訪問的地址 如果你想允許用戶root從ip為192.168.1.123的主機連接到mysql服務器&#xff0c;并使用password密碼登錄。&#xff08;根據情況自行替換&#xff09; GRANT ALL PRIVILEGES ON *.* TO root192.168.1.123 IDENTIFIED BY passwo…

Python奇幻之旅(從入門到入獄高級篇)——面相對象進階【中】

目錄 2. 面向對象進階 2.1. 成員 2.2. 變量 2.2. 方法 2.4. property屬性 2.5. 成員修飾符 2.6. 對象嵌套 2.7. 特殊成員 引言 本篇內容主要是面向對象的進階&#xff0c;講解一些特殊的成員和方法&#xff0c;更加深入迭代器是如何通過對象實現的。 2. 面向對象進階 …

Bellman-Ford(貝爾曼福特算法)

簡介 貝爾曼-福特算法&#xff08;Bellman-Ford Algorithm&#xff09;是一種用于求解單源最短路徑問題的算法&#xff0c;它可以處理帶有負權邊的圖。 該算法的實現思路是通過不斷迭代松弛操作來更新最短路徑&#xff0c;直到找到最優解。 名詞解釋&#xff1a;1. 松弛操作&…

Qt 獲取控件尺寸與實際不一致的問題

前提&#xff1a;界面ui獲取桌面大小&#xff0c;用resize() 重新調整了界面尺寸 然后 我獲取界面上某個控件大小時&#xff0c;發現與實際尺寸不一樣。 最后發現&#xff1a; 獲取控件大小的地方&#xff0c;必須在界面show()之后才可以&#xff0c;放之前不行。 注意; 經…

WPF 控件禁用時,顯示懸浮提示

WPF 控件禁用時&#xff0c;顯示懸浮提示 控件在禁用狀態下&#xff0c;按鈕是沒有懸浮提示信息的&#xff0c;是事件觸發的機制&#xff1b; 如果要禁用下也有懸浮提示&#xff0c;可以在控件外面加一層&#xff0c;例如&#xff1a; <Border Grid.Column"1" To…

Hive【內部表、外部表、臨時表、分區表、分桶表】【總結】

目錄 Hive的物種表結構特性 一、內部表 建表 使用場景 二、外部表 建表:關鍵詞【EXTERNAL】 場景&#xff1a; 外部表與內部表可互相轉換 三、臨時表 建表 臨時表橫向對比?編輯 四、分區表 建表&#xff1a;關鍵字【PARTITIONED BY】 場景&#xff1a; 五、分桶表 …

CentOS 7.x 使用 RPM 包安裝 Gitlab

官網&#xff1a;https://about.gitlab.com/ https://about.gitlab.cn/install/ 安裝&#xff1a;https://gitlab.cn/install/ 博客&#xff1a;https://gitlab.cn/blog/ 文檔&#xff1a;https://docs.gitlab.com/ https://about.gitlab.com/install/#centos-7 https://docs.g…