• <pre id="eq846"><cite id="eq846"></cite></pre>
  • <s id="eq846"><em id="eq846"></em></s>
    
    
    <td id="eq846"><em id="eq846"></em></td><sup id="eq846"></sup>
    您的位置:首頁>熱點 >
    • 如何以孫悟空七十二變去理解原型模式?

      2023-06-07 17:10:21 來源: 博客園


    (資料圖片)

    前言

    本文主要講述原型模式,文中使用通俗易懂的案例,使你更好的學習本章知識點并理解原理,做到有道無術。

    一.什么是原型模式

    原型模式是23種設計模式中創建型模式的一種,它關注的是用一個已經存在的實例對象作為原型,通過復制該原型對象來創建一個和原型對象相同的新對象。

    二.生活中的原型模式1.孫悟空

    孫悟空有獨一無二的法寶如意金箍棒和眾多法術,其中有一個名為身外身法的道術,孫悟空拔身上的毛幻化出另一個自己,這個大家應該有印象吧,這個幻化出新的分身就跟設計模式中的原型模式很相似。

    2.哪吒

    哪吒不管是西游記還是封神榜中都出現過,也是江帥所喜歡的中國神話人物之一,哪吒雖然沒有孫悟空會身外身法,但是他會三頭六臂,通過這個法術,哪吒會變換出2個新的頭顱和2對新的手臂,而這個三頭六臂是以頭或者手臂為參照物變化出來的,就跟設計模式中的原型模式很相似。

    3.漩渦鳴人

    旋渦鳴人是日本漫畫中火影忍者的人物,影分身之術是他最厲害的忍術之一。這個忍術是能夠變幻出多個相同的自己,以自己為參照物根據查克拉的量來變幻出不同的數量,這就跟設計模式中的原型模式很相似。

    三.原型模式的實現

    接下來江帥以孫悟空的身外身法之術來舉例,通過原型模式來實現。先創建一個武器類,再創建一個孫悟空的類并實現克隆接口

    package com.qianfeng.ran;/** @author:江帥*      孫悟空類*/public class SunWuKong implements Cloneable{    //名字    private String name;    //武器    private Weapon weapon;    public SunWuKong() {    }    public SunWuKong(String name, Weapon weapon) {        this.name = name;        this.weapon = weapon;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Weapon getWeapon() {        return weapon;    }    public void setWeapon(Weapon weapon) {        this.weapon = weapon;    }    @Override    public String toString() {        return "SunWuKong{" +            "name="" + name + """ +            ", weapon=" + weapon +            "}";    }    //身外身之術    @Override    protected Object clone() throws CloneNotSupportedException {        //通過 Object 類的 clone() 克隆出新的孫悟空        SunWuKong sunWuKong = (SunWuKong)super.clone();        //新的分身名等同當前名        sunWuKong.setName(name);        //新的分身手持同樣的武器,但為新的對象        sunWuKong.setWeapon(new Weapon(weapon.getName(),weapon.getSource()));        return sunWuKong;    }}/* * @author:江帥 *      武器類 */public class Weapon {    //武器名    private String name;    //來源    private String source;    public Weapon() {    }    public Weapon(String name, String source) {        this.name = name;        this.source = source;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getSource() {        return source;    }    public void setSource(String source) {        this.source = source;    }    @Override    public String toString() {        return "Weapon{" +                "name="" + name + """ +                ", source="" + source + """ +                "}";    }}

    最后通過原型模式來創建孫悟空的分身。

    package com.qianfeng.ran;/* * @author:江帥 *      客戶端 */public class Demo {    public static void main(String[] args) throws CloneNotSupportedException {        //phantom        //創建孫悟空對象,擁有東海龍宮的如意金箍棒        SunWuKong sunWuKong = new SunWuKong("孫悟空",new Weapon("如意金箍棒","東海龍宮"));        //調用克隆方法創建2個分身    --  身外身之術        SunWuKong phantom1 = (SunWuKong)sunWuKong.clone();        SunWuKong phantom2 = (SunWuKong)sunWuKong.clone();        //執行結果:        //SunWuKong{name="孫悟空", weapon=Weapon{name="如意金箍棒", source="東海龍宮"}}        System.out.println(sunWuKong.toString());        //執行結果:        //SunWuKong{name="孫悟空", weapon=Weapon{name="如意金箍棒", source="東海龍宮"}}        System.out.println(phantom1.toString());        //執行結果:        //SunWuKong{name="孫悟空", weapon=Weapon{name="如意金箍棒", source="東海龍宮"}}        System.out.println(phantom2.toString());        //改變分身的武器和出產地        phantom1.getWeapon().setName("芭蕉扇");        phantom1.getWeapon().setSource("火焰山");        phantom2.getWeapon().setName("紫金紅葫蘆");        phantom2.getWeapon().setSource("太上老君");        //執行結果:        //SunWuKong{name="孫悟空", weapon=Weapon{name="如意金箍棒", source="東海龍宮"}}        //執行結果:        System.out.println(sunWuKong.toString());        //執行結果:        //SunWuKong{name="孫悟空", weapon=Weapon{name="芭蕉扇", source="火焰山"}}        System.out.println(phantom1.toString());        //執行結果:        //SunWuKong{name="孫悟空", weapon=Weapon{name="紫金紅葫蘆", source="太上老君"}}        System.out.println(phantom2.toString());    }}
    四.總結

    在Java中克隆新的對象會產生相同的引用,改變克隆對象的內容會改變到原型對象,這個屬于淺拷貝,就像咱們的案例,如果用的是淺拷貝,打印結果會是3個武器都是來自太上老君的紫金紅葫蘆。

    而使用原型模式克隆出來的對象則跟原型對象不是同一個地址,改變克隆對象不會影響原型對象,這個屬于深拷貝,如案例所示每個對象里的內容不會因為別的對象的改變而改變。

    下一章,將帶大家學習市場供需關系(設計模式之生產者和消費者模式)。

    關鍵詞:

    免責聲明:本網站所有信息,并不代表本站贊同其觀點和對其真實性負責,投資者據此操作,風險請自擔。

    上一篇: 風景在路上作文500字

    下一篇:最后一頁

    相關閱讀
    欧美操片在线观看,午夜精品国产爱在线观看不卡,亚洲欧美中文日韩在线v日本,欧美极品另类xxx
    • <pre id="eq846"><cite id="eq846"></cite></pre>
    • <s id="eq846"><em id="eq846"></em></s>
      
      
      <td id="eq846"><em id="eq846"></em></td><sup id="eq846"></sup>
      主站蜘蛛池模板: 国产绳艺sm调教室论坛| 91xav在线| 西西人体44rt大胆高清日韩| 欧美专区在线视频| 国产精品成人一区无码| 亚洲日本天堂在线| 一本大道在线无码一区| 精品国产一区二区三区无码 | 综合图区亚洲欧美另类图片| 欧美啪啪动态图| 奇米视频7777| 国产一级在线免费观看| 亚洲人成电影在线观看网| japanesehd日本护士色| 草莓视频aqq | 92国产福利久久青青草原| 熟女精品视频一区二区三区| 大竹一重足舐男未删减版| 啊灬啊别停灬用力啊岳| 久久精品成人国产午夜| 48沈阳熟女高潮嗷嗷叫| 看全色黄大色黄女视频| 日日操夜夜操天天操| 国产chinese91在线| 中国毛片免费看| 色综合色综合久久综合频道| 日本XXXX裸体XXXX| 又色又爽又黄的三级视频在线观看| 亚洲AV成人无码天堂| 2345成人高清毛片| 欧美vpswindowssex| 国产成人av在线免播放观看| 亚洲中文字幕第一页在线| 91区国产福利在线观看午夜| 特黄特色大片免费| 少妇的丰满3中文字幕| 人妻中文字幕乱人伦在线| 一本大道无香蕉综合在线| 玉蒲团2之玉女心经| 天天看片日日夜夜| 伊人久久久大香线蕉综合直播|