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

歡迎訪問 生活随笔!

生活随笔

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

asp.net

设计模式五: 原型模式(Prototype)

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

簡介

原型模式是屬于創建型模式的一種,是通過拷貝原型對象來創建新的對象.

萬能的Java超類Object提供了clone()方法來實現對象的拷貝.

可以在以下場景中使用原型模式:

  • 構造函數創建對象成本太大(性能或安全成本)
  • 要保存對象的狀態, 且狀態變化較小, 不會過多占用內存時(狀態變化較大的使用狀態模式會更合適)
  • 意圖

    使用原型實例指定要創建的對象類型,并通過拷貝這個原型來創建新對象。

    類圖

    實現

    一. 淺拷貝和深拷貝的概念

    Object.clone()方法實現的是對象的淺拷貝, 所謂淺拷貝就是當對象中有復雜引用類型的域變量時, 只拷貝該域變量的引用而不是內容, 當有任一方法修改域變量的狀態時會同時影響原型對象及拷貝對象, 實際上他們共用了同一個堆內存. 深拷貝創建的對象即是對原對象的完全拷貝,對任一對象的操作不會影響其他對象的狀態.

    java中提供了Cloneable接口, 約定實現接口Cloneable且重寫Object.clone()方法的類可以用來拷貝自身. Cloneable是一個標記接口, 其中沒有定義任何方法.

    二. 下面的代碼演示了使用clone()方法實現的深拷貝,這種方式更適合用于比較簡單的對象,否則clone()方法的實現可能會變得異常復雜.

    import lombok.AllArgsConstructor; import lombok.Data;@Data @AllArgsConstructor public class CarProperty implements Cloneable {private String power;private double maxSpeed;private double oilPerKm;public Object clone(){Object obj = null;try {obj = super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return obj;} } import lombok.AllArgsConstructor; import lombok.Data;@Data @AllArgsConstructor public class Car implements Cloneable {private String brand;private double price;private CarProperty carProperty;/*** 深拷貝在此實現,對于復雜的應用類型, 這里的代碼可能會相當復雜,如果類有修改(新增成員變量等),這里也需要相應修改* @return*/public Object clone(){Object car = null;try {car = super.clone();CarProperty carPropertyClone = (CarProperty)this.getCarProperty().clone();((Car)car).setCarProperty(carPropertyClone);} catch (CloneNotSupportedException e) {e.printStackTrace();}return car;}public static void main(String[] args) {CarProperty carProperty = new CarProperty("8匹",250,30);Car car= new Car("BMW",200,carProperty);Car copy = (Car) car.clone();System.out.println("copy最大速度為: "+copy.getCarProperty().getMaxSpeed());System.out.println("原型最大速度為: "+car.getCarProperty().getMaxSpeed());car.getCarProperty().setMaxSpeed(360);System.out.println("copy最大速度為: "+copy.getCarProperty().getMaxSpeed());System.out.println("原型最大速度為: "+car.getCarProperty().getMaxSpeed());}}

    三. 深拷貝的其他實現方式: 除了上面的方法,還可以使用反射機制創建對象的深拷貝, 另外一種更簡單的方式是使用序列化;
    下面的代碼使用序列化方式實現對象的深拷貝,需實現Serializable接口.

    import java.io.*;public class DeepCloneBase implements Serializable {public Object deepClone() {ByteArrayOutputStream byteArrayOutputStream = null;ObjectOutputStream objectOutputStream = null;ByteArrayInputStream byteArrayInputStream = null;ObjectInputStream objectInputStream = null;try {byteArrayOutputStream = new ByteArrayOutputStream();objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);objectOutputStream.writeObject(this);byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());objectInputStream = new ObjectInputStream(byteArrayInputStream);return objectInputStream.readObject();} catch (Exception e) {e.printStackTrace();} finally {try {byteArrayOutputStream.close();objectOutputStream.close();byteArrayInputStream.close();objectInputStream.close();} catch (Exception e) {e.printStackTrace();}}return null;}} import lombok.AllArgsConstructor; import lombok.Data; import java.io.Serializable;@Data @AllArgsConstructor public class MyCar extends DeepCloneBase {private String brand;private double price;private CarProperty carProperty;public static void main(String[] args) throws Exception{// 注意CarProperty也需要實現Serializable接口,代碼不再單獨列出CarProperty carProperty = new CarProperty("8匹",250,30);MyCar car= new MyCar("BMW",200,carProperty);MyCar copy = (MyCar)car.deepClone();if (copy!=null){System.out.println("copy最大速度為: "+copy.getCarProperty().getMaxSpeed());System.out.println("原型最大速度為: "+car.getCarProperty().getMaxSpeed());car.getCarProperty().setMaxSpeed(360);System.out.println("copy最大速度為: "+copy.getCarProperty().getMaxSpeed());System.out.println("原型最大速度為: "+car.getCarProperty().getMaxSpeed());}else{System.out.println("對象沒拷貝成功....");}} }

    總結

    優點: 1. 如果對象創建比較復雜, 可以簡化創建過程, 提高效率;2. 可以保留對象狀態;
    缺點: 對于clone()方式,如果類有修改則需要修改clone()的實現,不符合開閉原則; 復雜對象的clone邏輯可能較復雜;

    JDK

    java.lang.Object#clone()

    總結

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

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