国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

詳解Java的設計模式編程中的原型模式

2019-11-26 14:37:37
字體:
來源:轉載
供稿:網友

定義:用原型實例指定創建對象的種類,并通過拷貝這些原型創建新的對象。
類型:創建類模式
類圖:

201623164927215.jpg (466×212)

原型模式主要用于對象的復制,它的核心是就是類圖中的原型類Prototype。Prototype類需要具備以下兩個條件:
實現Cloneable接口。在java語言有一個Cloneable接口,它的作用只有一個,就是在運行時通知虛擬機可以安全地在實現了此接口的類上使用clone方法。在java虛擬機中,只有實現了這個接口的類才可以被拷貝,否則在運行時會拋出CloneNotSupportedException異常。
重寫Object類中的clone方法。Java中,所有類的父類都是Object類,Object類中有一個clone方法,作用是返回對象的一個拷貝,但是其作用域protected類型的,一般的類無法調用,因此,Prototype類需要將clone方法的作用域修改為public類型。
        原型模式是一種比較簡單的模式,也非常容易理解,實現一個接口,重寫一個方法即完成了原型模式。在實際應用中,原型模式很少單獨出現。經常與其他模式混用,他的原型類Prototype也常用抽象類來替代。
實現代碼:

package PrototypePattern; public class PrototypeClass implements Cloneable{   @Override protected PrototypeClass clone(){     PrototypeClass prototypeClass = null;     try {   prototypeClass = (PrototypeClass)super.clone();  } catch (CloneNotSupportedException e) {   // TODO Auto-generated catch block   e.printStackTrace();  }     return prototypeClass; }}

客戶端:


package PrototypePattern; public class Client { public static void main(String[] args) {  PrototypeClass obj1 = new PrototypeClass();  PrototypeClass obj2 = obj1.clone();     System.out.println(obj1);  System.out.println(obj2); }}

原型模式的優點及適用場景
       使用原型模式創建對象比直接new一個對象在性能上要好的多,因為Object類的clone方法是一個本地方法,它直接操作內存中的二進制流,特別是復制大對象時,性能的差別非常明顯。
       使用原型模式的另一個好處是簡化對象的創建,使得創建對象就像我們在編輯文檔時的復制粘貼一樣簡單。
       因為以上優點,所以在需要重復地創建相似對象時可以考慮使用原型模式。比如需要在一個循環體內創建對象,假如對象創建過程比較復雜或者循環次數很多的話,使用原型模式不但可以簡化創建過程,而且可以使系統的整體性能提高很多。

public class Prototype implements Cloneable {  private ArrayList list = new ArrayList();  public Prototype clone(){   Prototype prototype = null;   try{    prototype = (Prototype)super.clone();    prototype.list = (ArrayList) this.list.clone();   }catch(CloneNotSupportedException e){    e.printStackTrace();   }   return prototype;  } } 


原型模式的注意事項:

  1. 構造函數不會被執行
  2. 淺拷貝和深拷貝
  3. clone和final的沖突

        由于ArrayList不是基本類型,所以成員變量list,不會被拷貝,需要我們自己實現深拷貝,幸運的是java提供的大部分的容器類都實現了Cloneable接口。所以實現深拷貝并不是特別困難。
PS:深拷貝與淺拷貝問題中,會發生深拷貝的有java中的8中基本類型以及他們的封裝類型,另外還有String類型。其余的都是淺拷貝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 高唐县| 民乐县| 石阡县| 德格县| 珠海市| 响水县| 杭锦旗| 察隅县| 屯留县| 牡丹江市| 鹿泉市| 通辽市| 双江| 集安市| 和田县| 渝北区| 那曲县| 嵩明县| 博爱县| 马公市| 会宁县| 吉水县| 河东区| 香河县| 绩溪县| 江津市| 杂多县| 秦皇岛市| 枣庄市| 濮阳市| 简阳市| 绥江县| 建水县| 当阳市| 绥滨县| 康保县| 独山县| 锡林郭勒盟| 黔西| 松阳县| 长岛县|