原型模式

原型模式

原型模式的定義

1.定義:用原型實(shí)例來(lái)創(chuàng)建指定對(duì)象的種類(lèi),并且通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象

原型模式其實(shí)就是從一個(gè)對(duì)象再創(chuàng)建另外一個(gè)可定制的對(duì)象,而且不需要知道任何的創(chuàng)建細(xì)節(jié)

原型模式的結(jié)構(gòu)圖

image-20210316090602263.png

原型模式的實(shí)現(xiàn)

代碼結(jié)構(gòu)圖:二版結(jié)構(gòu)圖(驗(yàn)證深拷貝與淺拷貝)

image-20210316095820886.png

調(diào)用關(guān)系

image-20210316100732315.png

1.新建具體原型類(lèi),實(shí)現(xiàn)Java.lang.Cloneable接口,并提供相對(duì)應(yīng)的方法,特別注意需要實(shí)現(xiàn)Cloneable的clone方法,該方法使原型模式的關(guān)鍵

package org.example.prototype;

/**
 * @author 
 * @date 2021/3/16 9:08
 **/
public class Resume implements Cloneable{

    private String name;
    private  String sex;
    private  String age;
    private String timeArea;
    private String company;

    public Resume(String name){
        this.name=name;
    }

    //設(shè)置個(gè)人信息
    public  void setPersonalInfo(String sex,String age){
        this.sex=sex;
        this.age=age;
    }
    //設(shè)置工作經(jīng)歷
    public void setWorkExperience(String timeArea,String company){
        this.timeArea=timeArea;
        this.company=company;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getTimeArea() {
        return timeArea;
    }

    public void setTimeArea(String timeArea) {
        this.timeArea = timeArea;
    }

    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }

    //顯示
    public void Display(){
        System.out.println("name="+this.getName()+"age="+this.getAge()+"sex="+this.getSex()+"timeArea="+this.getTimeArea()+"company="+this.getCompany());
    }
    //clone方法是實(shí)現(xiàn)原型模式的關(guān)鍵
    @Override
    public Resume clone(){
        Resume resume=null;
        try{
            resume= (Resume) super.clone();
        }catch (Exception e){
            e.printStackTrace();
        }
        return resume;
    }
}

2.新建客戶(hù)端進(jìn)行調(diào)用

package org.example.prototype;

/**
 * @author 
 * @date 2021/3/16 9:20
 **/
public class Test {

    public static void main(String[] args) {
        Resume resume = new Resume("原型設(shè)計(jì)模式");
        resume.setPersonalInfo("男","29");
        resume.setWorkExperience("2020","run");
        resume.Display();
        Resume clone = resume.clone();
        clone.setPersonalInfo("女","18");
        clone.setWorkExperience("2021","HurryRun");
        clone.Display();
    }
}

3.運(yùn)行結(jié)果

image-20210316093518471.png

**深拷貝與淺拷貝

  • 深拷貝與淺拷貝征懈。Object類(lèi)的clone方法只會(huì)拷貝對(duì)象中的基本的數(shù)據(jù)類(lèi)型吁系,對(duì)于數(shù)組捌斧、容器對(duì)象、引用對(duì)象等都不會(huì)拷貝炼邀,這就是淺拷貝。如果要實(shí)現(xiàn)深拷貝剪侮,必須將原型模式中的數(shù)組拭宁、容器對(duì)象、引用對(duì)象等另行拷貝瓣俯。

    因此如果是沒(méi)有實(shí)現(xiàn)Cloneable接口的對(duì)象需要自己實(shí)現(xiàn)一次如:

package org.example.prototype;

/**
* @author 
* @date 2021/3/16 9:37
**/
public class WorkExperience implements Cloneable{
  private String timeArea;
  private String company;

  public String getTimeArea() {
      return timeArea;
  }

  public void setTimeArea(String timeArea) {
      this.timeArea = timeArea;
  }

  public String getCompany() {
      return company;
  }

  public void setCompany(String company) {
      this.company = company;
  }
  //實(shí)現(xiàn)深拷貝
  @Override
  public WorkExperience clone(){
      WorkExperience workExperience=null;
      try{
          workExperience= (WorkExperience) super.clone();
      }catch (Exception e){
          e.printStackTrace();
      }
      return workExperience;
  }
}

如果對(duì)象本身已經(jīng)實(shí)現(xiàn)了Cloneable接口只需要克隆時(shí)調(diào)用一次clone接口即可,如ArrayList

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; 
    }
}

原型模式的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

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

2.使用原型模式的另一個(gè)好處就是簡(jiǎn)化了對(duì)象的創(chuàng)建,使創(chuàng)建對(duì)象就像我們?cè)诰庉嬑臋n時(shí)的復(fù)制粘貼一樣

缺點(diǎn)

使用原型模式復(fù)制對(duì)象不會(huì)調(diào)用類(lèi)的構(gòu)造器創(chuàng)建對(duì)象,不但構(gòu)造器中的代碼無(wú)法執(zhí)行,甚至訪問(wèn)權(quán)限都對(duì)原型模式無(wú)效;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末杰标,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子彩匕,更是在濱河造成了極大的恐慌腔剂,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驼仪,死亡現(xiàn)場(chǎng)離奇詭異掸犬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)绪爸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)湾碎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人毡泻,你說(shuō)我怎么就攤上這事胜茧。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵呻顽,是天一觀的道長(zhǎng)雹顺。 經(jīng)常有香客問(wèn)我,道長(zhǎng)廊遍,這世上最難降的妖魔是什么嬉愧? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮喉前,結(jié)果婚禮上没酣,老公的妹妹穿的比我還像新娘。我一直安慰自己卵迂,他們只是感情好裕便,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著见咒,像睡著了一般偿衰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上改览,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天下翎,我揣著相機(jī)與錄音,去河邊找鬼宝当。 笑死视事,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的庆揩。 我是一名探鬼主播俐东,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼盾鳞!你這毒婦竟也來(lái)了犬性?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤腾仅,失蹤者是張志新(化名)和其女友劉穎乒裆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體推励,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鹤耍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了验辞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稿黄。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖跌造,靈堂內(nèi)的尸體忽然破棺而出杆怕,到底是詐尸還是另有隱情族购,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布陵珍,位于F島的核電站寝杖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏互纯。R本人自食惡果不足惜瑟幕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望留潦。 院中可真熱鬧只盹,春花似錦、人聲如沸兔院。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秆乳。三九已至懦鼠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屹堰,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工街氢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扯键,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓珊肃,卻偏偏與公主長(zhǎng)得像荣刑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子伦乔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容