<dfn id="ccosy"></dfn>
  • <ul id="ccosy"></ul>

  • 【資料圖】

    前言

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

    一.什么是原型模式

    原型模式是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個武器都是來自太上老君的紫金紅葫蘆。

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

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

    推薦內容

    国产精品深爱在线| 99精品中文字幕| 在线日韩麻豆一区| 麻豆精品国产免费观看| 99在线视频精品| 国产精品女同一区二区| 国产午夜精品理论片免费观看| 一本精品99久久精品77| 亚洲处破女AV日韩精品| 国产福利vr专区精品| 麻豆国产VA免费精品高清在线| 国产精品一国产AV麻豆| 精品国产第一国产综合精品| 国产一区二区精品| 日韩精品无码人成视频手机 | 欧美日韩精品一区二区在线视频| 国产精品天干天干| 国产精品视频久久久久久| 好叼操这里只有精品| 香蕉久久精品日日躁夜夜躁 | 香港aa三级久久三级老师2021国产三级精品三级在| 国产成人亚洲精品电影| 国产精品久久久久久影视| 国产精品麻豆欧美日韩WW| 国产精品无码一区二区在线| 狠狠精品干练久久久无码中文字幕| 国产精品99久久久久久宅男小说| 国产精品反差婊在线观看| 97精品国产一区二区三区| 亚洲精品午夜在线观看| 精品无人区一区二区三区在线| 91热久久免费精品99| 久久精品国产99国产精品导航| 精品三级AV无码一区| 69国产成人综合久久精品91| 久久亚洲AV无码精品色午夜麻豆| 精品女同一区二区三区免费站 | 国产精品无码v在线观看| 国产偷窥熟女高潮精品视频| 精品熟女少妇aⅴ免费久久| 国产午夜亚洲精品午夜鲁丝片|