設計模式JAVA-原型模式(五)

1.原型模式

1.1 場景

克隆羊問題
現在有一隻羊 tom,姓名爲: tom, 年齡爲:1,顏色爲:白色,請編寫程序創建和 tom 羊 屬性完全相同的 10只羊。

傳統代碼:
在這裏插入圖片描述

傳統的方式的優缺點

  1. 優點是比較好理解,簡單易操作。
  2. 在創建新的對象時,總是需要重新獲取原始對象的屬性,如果創建的對象比較複雜時,效率較低
  3. 總是需要重新初始化對象,而不是動態地獲得對象運行時的狀態, 不夠靈活
  4. 改進的思路分析
    思路:Java 中 Object 類是所有類的根類,Object 類提供了一個 clone()方法,該方法可以將一個 Java 對象複製一份,但是需要實現 clone 的 Java 類必須要實現一個接口 Cloneable,該接口表示該類能夠複製且具有複製的能力 =>原型模式

1.2 原型模式

基本內容

  1. 原型模式(Prototype模式)是指:用原型實例指定創建對象的種類,並且通過拷貝這些原型,創建新的對象
  2. 原型模式是一種創建型設計模式,允許一個對象再創建另外一個可定製的對象,無需知道如何創建的細節
  3. 工作原理是:通過將一個原型對象傳給那個要發動創建的對象,這個要發動創建的對象通過請求原型對象拷貝它們自己來實施創建,即 對象.clone()

原型模式原理結構圖-uml類圖

在這裏插入圖片描述
原理結構圖說明

  1. Prototype: 原型類,聲明一個克隆自己的接口
  2. ConcretePrototype: 具體的原型類, 實現一個克隆自己的操作
  3. Client:讓一個原型對象克隆自己,從而創建一個新的對象(屬性一樣)

編寫一個羊實體類
在這裏插入圖片描述
並在這個類裏編寫自己原型克隆
在這裏插入圖片描述
在這裏插入圖片描述

1.3 Spring原型模式

在這裏插入圖片描述
在這裏插入圖片描述

1.4 淺拷貝的介紹

  1. 對於數據類型是基本數據類型的成員變量,淺拷貝會直接進行值傳遞,也就是將該屬性值複製一份給新的對象。
  2. 對於數據類型是引用數據類型的成員變量,比如說成員變量是某個數組、某個類的對象等,那麼淺拷貝會進行引用傳遞,也就是隻是將該成員變量的引用值(內存地址)複製一份給新的對象。因爲實際上兩個對象的該成員變量都指向同一個實例。在這種情況下,在一個對象中修改該成員變量會影響到另一個對象的該成員變量值
  3. 前面我們克隆羊就是淺拷貝
  4. 淺拷貝是使用默認的 clone()方法來實現
    sheep = (Sheep) super.clone();
    5)說白了,淺拷貝,只拷貝基本屬性哪些字段的值,引用對象的話,也只拷貝相同引用地址,不會重新在堆裏生成新的對象地址
    在這裏插入圖片描述
    在這裏插入圖片描述

1.5 深拷貝的介紹

  1. 複製對象的所有基本數據類型的成員變量值
  2. 爲所有引用數據類型的成員變量申請存儲空間,並複製每個引用數據類型成員變量所引用的對象,直到該對象可達的所有對象。也就是說,對象進行深拷貝要對整個對象( (包括對象的引用類型) )進行拷貝

深拷貝實現方式 1:重寫 clone()方法來實現深拷貝,但是這種方法,若有多個引用對象,那麼就要增加多個引用對象的修改
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

深拷貝實現方式 2:通過對象序列化實現深拷貝==(推薦)==,這個相當於把該對象整個都重新生成了一遍,不用像上一個那樣,需要一個一個修改
在這裏插入圖片描述
在這裏插入圖片描述

1.7 原型模式的注意事項和細節

  1. 創建新的對象比較複雜時,可以利用原型模式簡化對象的創建過程,同時也能夠提高效率
  2. 不用重新初始化對象,而是動態地獲得對象運行時的狀態
  3. 如果原始對象發生變化(增加或者減少屬性),其它克隆對象的也會發生相應的變化,無需修改代碼
  4. 在實現深克隆的時候可能需要比較複雜的代碼
  5. 缺點:需要爲每一個類配備一個克隆方法,這對全新的類來說不是很難,但對已有的類進行改造時,需要修改其源代碼,違背了 ocp原則,這點請同學們注意.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章