• <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>
      主站蜘蛛池模板: 中文字幕国语对白在线电影| 免费极品av一视觉盛宴| 啊灬用力啊灬啊灬快灬深| 亚洲国产精品一区二区九九| 一级做a爱片在线播放| 黄色a级片网站| 最近免费中文字幕mv在线电影 | 国产99视频在线| 久久99热66这里只有精品一| 范冰冰hd未删减版在线观看| 日本三级黄视频| 国产ts人妖视频| 中文字幕精品一区二区精品| 国产激爽大片高清在线观看| 欧欧美18videosex性哦欧美美| 大陆黄色a级片| 亚洲精品国产肉丝袜久久| 92国产精品午夜福利| 欧美日韩一区二区三区四区在线观看 | 国产欧美日韩精品专区| 亚洲第一区视频| juy639黑人教练君岛美绪| 猫咪免费人成网站在线观看入口| 大学生美女特级毛片| 亚洲欧洲日产国码AV系列天堂| 7x7x7x免费在线观看| 涂了媚药的玉势| 天天摸夜夜摸成人免费视频| 十八禁视频在线观看免费无码无遮挡骂过 | 国产精品久久久久久| 五月婷婷伊人网| 视频免费1区二区三区| 日韩深夜福利视频| 国产丰满老熟女重口对白| 久久精品99国产精品日本| 亚洲乱码一二三四区乱码| 日韩国产欧美在线观看一区二区 | 免费A级毛片无码免费视频首页| 99国产情在线视频| 欧美v日韩v亚洲v最新| 国产亚洲福利一区二区免费看|