04-03-設計模式 原型模式
阿新 • • 發佈:2022-05-27
克隆羊問題
現在有一隻羊Tom, 姓名: Tom 年齡: 1, 顏色為白色, 編寫程式建立 和 Tom 羊屬性完全相同的10只羊
傳統方式解決
思路分析
程式碼
package com.dance.design.designmodel.ysms; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; public class yxms { public static void main(String[] args) { Sheep sheep = new Sheep("tom", 1, "白色"); List<Sheep> collect = IntStream.range(0, 10).mapToObj(x -> sheep.clone()).collect(Collectors.toList()); System.out.println(collect); } } class Sheep implements Cloneable{ String name; Integer age; String color; public Sheep(String name, Integer age, String color) { this.name = name; this.age = age; this.color = color; } @Override public Sheep clone() { try { return (Sheep) super.clone(); } catch (CloneNotSupportedException e) { throw new AssertionError(); } } }
額, 我並沒有像視訊中那樣寫, 我知道JDK中有Cloneable這個介面, 實現了應該就可以實現克隆的
原型模式介紹
- 原型模式是指,用原型例項指定物件建立的種類,並且通過拷貝這些原型,建立新的物件
- 原型模式是一種建立型設計模式, 允許一個物件再建立另一個可定製的物件, 無需知道如何建立的細節
- 工作原理是: 通過將一個原型物件傳給那個要發動建立的物件,這個要發動建立的物件通過請求原型物件拷貝他們自己來實施建立 即物件.clone()
- 其實就是影印
原型模式類圖
原理結果圖說明
- Prototype: 原型類, 宣告一個克隆自己的介面
- ConcretePrototype: 具體的原型類, 實現一個克隆自己的操作
- Client: 讓一個原型物件克隆自己, 從而建立一個新的物件(屬性一樣)
原型模式解決克隆問題
使用原型模式改進傳統方式問題, 讓程式具有更高的效率和擴充套件性
程式碼
我靠, 看到程式碼的時候, 直接給我搞破防了, 原來我TM上面寫的就是原型模式, 難不成我已經進入第五層了?
原始碼剖析
Spring框架中的應用
在SPring中多利Bean就是通過原型模式實現的
深拷貝與淺拷貝
深拷貝
就是物件依賴物件, 而不是基本資料型別
大概就是這樣的情況
在呼叫拷貝方法的時候,依賴物件也應該是建立新的,引用也應該改變
- 實現方法
- 自己寫
- JSON 來回轉換
淺拷貝
就是我們當前實現的Cloneable介面,直接呼叫父類的clone方法, 如果沒有重寫過,那麼就是淺拷貝, 只會拷貝基本型別, 引用型別是直接賦值的
- 實現方法
- 自己寫
- 實現Cloneable介面
我不想過多寫這個這個東西,大家知道怎麼實現就行了
原型模式的注意事項和細節
- 建立新的物件比較複雜時, 可以利用原型模式簡化物件的建立過程,同時也能提高效率
- 不用重複初始化物件, 而是動態的獲取物件執行時狀態
- 如果原始物件發生變化(增加或減少屬性), 其他克隆物件的也會發生響應的變化, 無需修改程式碼
- 在實現深度克隆的時候可能需要比較複雜的程式碼
- 缺點
- 需要為每一個類配備一個克隆方法,這對全新的類來說不是很難, 但是對已有的類進行改造時,需要修改其原始碼, 違背了OCP原則, 這點需要注意