欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

設(shè)計(jì)模式之原型模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

 更新時(shí)間:2017年08月10日 10:16:47   作者:zhengzhb  
這篇文章主要介紹了設(shè)計(jì)模式之原型模式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

定義:用原型實(shí)例指定創(chuàng)建對象的種類,并通過拷貝這些原型創(chuàng)建新的對象。

類型:創(chuàng)建類模式

類圖:

原型模式主要用于對象的復(fù)制,它的核心是就是類圖中的原型類Prototype。Prototype類需要具備以下兩個(gè)條件:

  • 實(shí)現(xiàn)Cloneable接口。在java語言有一個(gè)Cloneable接口,它的作用只有一個(gè),就是在運(yùn)行時(shí)通知虛擬機(jī)可以安全地在實(shí)現(xiàn)了此接口的類上使用clone方法。在java虛擬機(jī)中,只有實(shí)現(xiàn)了這個(gè)接口的類才可以被拷貝,否則在運(yùn)行時(shí)會(huì)拋出CloneNotSupportedException異常。
  • 重寫Object類中的clone方法。Java中,所有類的父類都是Object類,Object類中有一個(gè)clone方法,作用是返回對象的一個(gè)拷貝,但是其作用域protected類型的,一般的類無法調(diào)用,因此,Prototype類需要將clone方法的作用域修改為public類型。

原型模式是一種比較簡單的模式,也非常容易理解,實(shí)現(xiàn)一個(gè)接口,重寫一個(gè)方法即完成了原型模式。在實(shí)際應(yīng)用中,原型模式很少單獨(dú)出現(xiàn)。經(jīng)常與其他模式混用,他的原型類Prototype也常用抽象類來替代。

實(shí)現(xiàn)代碼:

class Prototype implements Cloneable { 
  public Prototype clone(){ 
    Prototype prototype = null; 
    try{ 
      prototype = (Prototype)superclone(); 
    }catch(CloneNotSupportedException e){ 
      e.printStackTrace(); 
    } 
    return prototype;  
  } 
} 
 
class ConcretePrototype extends Prototype{ 
  public void show(){ 
    System.out.println("原型模式實(shí)現(xiàn)類"); 
  } 
} 
 
public class Client { 
  public static void main(String[] args){ 
    ConcretePrototype cp = new ConcretePrototype(); 
    for(int i=0; i< 10; i++){ 
      ConcretePrototype clonecp = (ConcretePrototype)cpclone(); 
      clonecp.show(); 
    } 
  } 
} 

原型模式的優(yōu)點(diǎn)及適用場景

使用原型模式創(chuàng)建對象比直接new一個(gè)對象在性能上要好的多,因?yàn)镺bject類的clone方法是一個(gè)本地方法,它直接操作內(nèi)存中的二進(jìn)制流,特別是復(fù)制大對象時(shí),性能的差別非常明顯。

使用原型模式的另一個(gè)好處是簡化對象的創(chuàng)建,使得創(chuàng)建對象就像我們在編輯文檔時(shí)的復(fù)制粘貼一樣簡單。

因?yàn)橐陨蟽?yōu)點(diǎn),所以在需要重復(fù)地創(chuàng)建相似對象時(shí)可以考慮使用原型模式。比如需要在一個(gè)循環(huán)體內(nèi)創(chuàng)建對象,假如對象創(chuàng)建過程比較復(fù)雜或者循環(huán)次數(shù)很多的話,使用原型模式不但可以簡化創(chuàng)建過程,而且可以使系統(tǒng)的整體性能提高很多。

原型模式的注意事項(xiàng)

  • 使用原型模式復(fù)制對象不會(huì)調(diào)用類的構(gòu)造方法。因?yàn)閷ο蟮膹?fù)制是通過調(diào)用Object類的clone方法來完成的,它直接在內(nèi)存中復(fù)制數(shù)據(jù),因此不會(huì)調(diào)用到類的構(gòu)造方法。不但構(gòu)造方法中的代碼不會(huì)執(zhí)行,甚至連訪問權(quán)限都對原型模式無效。還記得單例模式嗎?單例模式中,只要將構(gòu)造方法的訪問權(quán)限設(shè)置為private型,就可以實(shí)現(xiàn)單例。但是clone方法直接無視構(gòu)造方法的權(quán)限,所以,單例模式與原型模式是沖突的,在使用時(shí)要特別注意。
  • 深拷貝與淺拷貝。Object類的clone方法只會(huì)拷貝對象中的基本的數(shù)據(jù)類型,對于數(shù)組、容器對象、引用對象等都不會(huì)拷貝,這就是淺拷貝。如果要實(shí)現(xiàn)深拷貝,必須將原型模式中的數(shù)組、容器對象、引用對象等另行拷貝。例如:
public class Prototype implements Cloneable { 
  private ArrayList list = new ArrayList(); 
  public Prototype clone(){ 
    Prototype prototype = null; 
    try{ 
      prototype = (Prototype)superclone(); 
      prototype.list = (ArrayList) this.list.clone(); 
    }catch(CloneNotSupportedException e){ 
      e.printStackTrace(); 
    } 
    return prototype;  
  } 
} 

由于ArrayList不是基本類型,所以成員變量list,不會(huì)被拷貝,需要我們自己實(shí)現(xiàn)深拷貝,幸運(yùn)的是Java提供的大部分的容器類都實(shí)現(xiàn)了Cloneable接口。所以實(shí)現(xiàn)深拷貝并不是特別困難。

PS:深拷貝與淺拷貝問題中,會(huì)發(fā)生深拷貝的有java中的8中基本類型以及他們的封裝類型,另外還有String類型。其余的都是淺拷貝。

相關(guān)文章

  • Java的Struts框架中<results>標(biāo)簽的使用方法

    Java的Struts框架中<results>標(biāo)簽的使用方法

    這篇文章主要介紹了Java的Struts框架中<results>標(biāo)簽的使用方法,Struts框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-11-11
  • SpringCloud連接不上遠(yuǎn)程N(yùn)acos問題排查

    SpringCloud連接不上遠(yuǎn)程N(yùn)acos問題排查

    本文主要介紹了SpringCloud連接不上遠(yuǎn)程N(yùn)acos問題排查,可能是因?yàn)槲撮_放端口,或集群內(nèi)部通信異常等,下面就來介紹一下問題解決,感興趣的可以了解一下
    2024-06-06
  • java發(fā)送http get請求的兩種方式

    java發(fā)送http get請求的兩種方式

    這篇文章主要為大家詳細(xì)介紹了java發(fā)送http get請求的兩種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java 內(nèi)存模型中的happen-before關(guān)系詳解

    Java 內(nèi)存模型中的happen-before關(guān)系詳解

    這篇文章主要為大家介紹了Java 內(nèi)存模型中的happen-before關(guān)系示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • JAVA開發(fā)環(huán)境搭建教程

    JAVA開發(fā)環(huán)境搭建教程

    這篇文章主要為大家詳細(xì)介紹了JAVA開發(fā)環(huán)境搭建教程,配置JAVA開發(fā)環(huán)境,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 解決Maven多模塊編譯慢的問題

    解決Maven多模塊編譯慢的問題

    這篇文章主要介紹了Maven多模塊編譯慢的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • MybatisPlus字段類型轉(zhuǎn)換的實(shí)現(xiàn)示例

    MybatisPlus字段類型轉(zhuǎn)換的實(shí)現(xiàn)示例

    本文主要介紹了MybatisPlus如何完成字段類型轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Java中全局變量和局部變量詳解(看這篇就夠了)

    Java中全局變量和局部變量詳解(看這篇就夠了)

    在Java中全局變量和局部變量是兩種不同作用域的變量,這篇文章主要給大家介紹了關(guān)于Java中全局變量和局部變量的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),大家看這篇就夠了,需要的朋友可以參考下
    2023-11-11
  • Java BigDecimal案例詳解

    Java BigDecimal案例詳解

    這篇文章主要介紹了Java BigDecimal案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 用Java生成二維碼并附帶文字信息

    用Java生成二維碼并附帶文字信息

    這篇文章主要介紹了用Java生成二維碼并附帶文字信息,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04

最新評(píng)論