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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式_4_原型模式(对象的拷贝)

發布時間:2024/7/5 asp.net 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式_4_原型模式(对象的拷贝) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原形模式(PrototypePattern, 創建型模式,創建重復對象且保證性能, 對象的克隆)

通常使用原型模式創建一個原型接口, 用于獲取創建對象的克隆, 對于淺拷貝與深拷貝不用糾結, 他們二者的區別就在于重寫Clonable的clone方法

淺拷貝與深拷貝

淺拷貝: 直接調用Object的clone

public Object clone() {Object clone=null;try {clone=super.clone(); //不用管Object內部元素的情況直接調用Object的clone方法}catch(CloneNotSupportedException e) {e.printStackTrace();}return clone;}

深拷貝: 對clone對象( 此對象內部具有數組/集合/map等復合數據 )內部的數據再進行一次克隆

此處假設clone對象內部有一個ArrayList數組, ArrayList中存儲A對象public Object clone() {Object clone=null;try {clone=super.clone();clone.getArray() = new ArrayList<A>(array.size()); //先將內部的ArrayList克隆出來for (int i=0; i < array.size(); i++){// 然后對ArrayList中的數據進行逐一克隆//從數組中獲取每個元素, 然后進行克隆, 此處A對象內部沒有復合數據, 最后將clone好的數據存入clone的array中clone.getArray().add( (A)array.get(i).clone() );}}catch(CloneNotSupportedException e) {e.printStackTrace();}return clone;} 因為只是調用Object的clone無法對克隆對象內部的數組類型進行復制, 所以還要針對拷貝對象的內部的數組再一次

操作流程

  • 使用方式
原型模式通過拷貝一個現有對象生成新對象.淺拷貝實現Clonable接口, 重寫clone方.深拷貝與淺拷貝一致, 也可以通過實現Serializable讀取二進制流1.利用序列化產生的對象是對原對象的復制2.將對象序列化存入緩沖區, 然后將緩沖區對象讀出, 用clone的引用指向該對象
  • 角色定義
原型角色:定義用于復制現有的實例來生成新的實例的方法(實現Cloneable接口的類) 具體原型角色:實現用于復制現有實例來生成新實例的方法(具有clone()方法的類) 使用者角色:維護一個注冊表, 提供獲取clone的類
  • 使用場景
1.資源優化, 類加載需要消耗很多資源, 性能和安全要求高的場景 2.通過new產生一個對象需要非常繁瑣的數據準備或訪問權限,則可以使用原型模型 3.一個對象,多個修改者 4.大多數原型模式伴隨工廠模式出現,通過clone方法創建一個對象,然后由工廠方法提供給調用者
  • 優點
    性能提高,逃避構造函數的約束, 不推薦使用序列化處理clone

  • 缺點
    配備克隆操作需要對類的功能全盤考慮,對已有的類不一定很容易,特別是當一個類飲用不支持串行化的間接對象,或者引用含有循環結構(對象出現多層次的引用); 必須實現Cloneable接口

代碼演示:

利用克隆, 事先將一些構造需要高代價的對象放入緩沖區, 然后在下次需要新的對象的時候直接去緩沖區拿( 緩沖區利用clone的方式給新對象, 而不是通過構造函數 )

package com.PrototypePattern;import java.util.Hashtable;public class ShapePrototypePattern {public static void main(String[] args) {//設計一個圓形的緩沖區Shape shape = new Circle();shape.setId("1");ShapeCache.loadCache(shape);//使用對應的圖形緩沖區獲得克隆對象clone, clone1, clone2Shape clonedShape=ShapeCache.getShape("1");System.out.println("Shape: "+clonedShape.hashCode());Shape clonedShape1=ShapeCache.getShape("1");System.out.println("Shape: "+clonedShape1.hashCode());Shape clonedShape2=ShapeCache.getShape("1");System.out.println("Shape: "+clonedShape2.hashCode());}} //針對不同的圖形設計不同的緩沖區模塊克隆模塊 class ShapeCache{private static Hashtable<String,Shape>shapeMap=new Hashtable<String,Shape>();//使用get方法獲得的圖形都是原圖形的克隆對象public static Shape getShape(String id) {Shape cachedShape=shapeMap.get(id);return (Shape)cachedShape.clone();}//將new出的對象放入Hashtable, 獲得相應的圖形直接獲取clonepublic static void loadCache(Shape shape) {shapeMap.put(shape.getId(), shape);} }//原型角色,實現Cloneable接口,調用Object的clone方法 //當具體實現類需要clone的時候就可以直接調用clone abstract class Shape implements Cloneable{private String id;protected String type;abstract public void draw(); public String getType() {return type;}public String getId() {return id;}public void setId(String id) {this.id=id;}public Object clone() {Object clone=null;try {clone=super.clone();}catch(CloneNotSupportedException e) {e.printStackTrace();}return clone;} }class Circle extends Shape{public Circle() {type="Circle";}@Overridepublic void draw() {System.out.println("Circle");} } class Rectangle extends Shape{public Rectangle() {type="Rectangle";}@Overridepublic void draw() {System.out.println("Rectangle");} } class Square extends Shape{public Square() {type="Square";}@Overridepublic void draw() {System.out.println("Square");} }

結語:

原型模式就是clone, 用于提高性能, 避免構造對象的時候加大資源的開銷

上面有錯, 還請指出, 如果認為我寫的還不錯, 還請點個贊, 多多支持一下, O(∩_∩)O~~

總結

以上是生活随笔為你收集整理的设计模式_4_原型模式(对象的拷贝)的全部內容,希望文章能夠幫你解決所遇到的問題。

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