• <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麻豆王友容| 四虎国产精品免费久久| 亚洲AV永久无码一区二区三区| 91东航翘臀女神在线播放| 热久久99影院| 在线观看免费午夜大片| 人妻少妇精品中文字幕AV蜜桃| jux662正在播放三浦惠理子| 粉嫩极品国产在线观看| 好想吃你的馒头| 人妻少妇看A偷人无码精品视频 | 97精品一区二区视频在线观看| 激情无码人妻又粗又大| 在线观看二区三区午夜| 亚洲欧美综合人成野草| 2020天堂中文字幕一区在线观| 欧美成人免费在线视频| 国产男女猛视频在线观看 | 精品亚洲欧美无人区乱码| 欧美精品高清在线观看| 国产麻传媒精品国产AV| 亚洲国产精品专区| 69式互添免费视频| 日韩精品无码一区二区视频| 国产在线观a免费观看| 久久久久久久久久国产精品免费| 老子影院伦不卡欧美| 尹人久久大香找蕉综合影院| 伊人色综合九久久天天蜜桃| 97久视频精品视频在线老司机| 欧美性xxxxx极品| 国产成人精品无码一区二区| 久久久久久久伊人电影| 精品无码一区二区三区亚洲桃色| 奇米影视888欧美在线观看| 亚洲熟妇av一区二区三区下载 | 亚洲va久久久噜噜噜久久天堂| 国产精品亚洲四区在线观看| 无码人妻丰满熟妇区免费| 免费看一毛一级毛片视频| 91天堂国产在线在线播放 |