如何以孙悟空七十二变去理解原型模式?

作者: 来源: 博客园 2023-06-08 07:51:27

 


【资料图】

前言

本文主要讲述原型模式,文中使用通俗易懂的案例,使你更好的学习本章知识点并理解原理,做到有道无术。

一.什么是原型模式

原型模式是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个武器都是来自太上老君的紫金红葫芦。

而使用原型模式克隆出来的对象则跟原型对象不是同一个地址,改变克隆对象不会影响原型对象,这个属于深拷贝,如案例所示每个对象里的内容不会因为别的对象的改变而改变。

下一章,将带大家学习市场供需关系(设计模式之生产者和消费者模式)。

 

相关文章
最近更新
  • 如何以孙悟空七十二变去理解原型模式?

    如何以孙悟空七十二变去理解原型模式?

    2023-06-08

  • 2023年法网:德约科维奇与阿尔卡拉斯会师男单半决赛

    2023年法网:德约科维奇与阿尔卡拉斯会师男单半决赛

    2023-06-08

  • 国网天津滨海公司:全力保障高考电力可靠供应

    国网天津滨海公司:全力保障高考电力可靠供应

    2023-06-08

  • 可能造成一定损失!北京2区发布冰雹黄色预警

    可能造成一定损失!北京2区发布冰雹黄色预警

    2023-06-08

  • 深水规院06月07日主力资金大幅流出

    深水规院06月07日主力资金大幅流出

    2023-06-08

  • 【天天速看料】茌平区气象台发布高温橙色预警【Ⅱ/严重】【2023-06-07】

    【天天速看料】茌平区气象台发布高温橙色预警【Ⅱ/严重】【2023-06-07】

    2023-06-08

  • 济南高考生忘带身份证,民警5秒钟打出临时身份证明

    济南高考生忘带身份证,民警5秒钟打出临时身份证明

    2023-06-08

  • 淄博在全省首推“无还本续贷”创业担保贷款,企业无需还本也可续贷

    淄博在全省首推“无还本续贷”创业担保贷款,企业无需还本也可续贷

    2023-06-08

  • 我非生而知之者好古敏以求之者也的意思是什么_我非生而知之者,好古,敏以求之者也的意思-全球资讯

    我非生而知之者好古敏以求之者也的意思是什么_我非生而知之者,好古,敏以求之者也的意思-全球资讯

    2023-06-08

  • 泰国恐怖片校园怪谈在线观看_泰国恐怖片

    泰国恐怖片校园怪谈在线观看_泰国恐怖片

    2023-06-08

  • 铝土矿的主要成分是氧化物吗_铝土矿的主要成分 焦点滚动

    铝土矿的主要成分是氧化物吗_铝土矿的主要成分 焦点滚动

    2023-06-08

  • 一牛顿的力等于多少千克_一牛顿的力等于多少公斤

    一牛顿的力等于多少千克_一牛顿的力等于多少公斤

    2023-06-08

  • 环球热资讯!宇宙最多的两个元素是氢和什么_宇宙最多的两个元素是什么

    环球热资讯!宇宙最多的两个元素是氢和什么_宇宙最多的两个元素是什么

    2023-06-08

  • 数列收敛的几何意义是什么_数列收敛的定义 世界快看

    数列收敛的几何意义是什么_数列收敛的定义 世界快看

    2023-06-08

  • 陕西省政府办公厅最新通知

    陕西省政府办公厅最新通知

    2023-06-08

  • 生活污染物_关于生活污染物介绍-全球最新

    生活污染物_关于生活污染物介绍-全球最新

    2023-06-08

  • 本田思域旅行车七座 本田思域旅行车报价 环球热讯

    本田思域旅行车七座 本田思域旅行车报价 环球热讯

    2023-06-08

  • 踏板摩托车什么牌子好新大洲本田 踏板摩托车什么牌子好

    踏板摩托车什么牌子好新大洲本田 踏板摩托车什么牌子好

    2023-06-08

  • 大盘弱势震荡不改  走势反复在所难免

    大盘弱势震荡不改  走势反复在所难免

    2023-06-08

  • “梦想守护者”——高考将至,他们合力为福州学子“保驾护航”!-今日热讯

    “梦想守护者”——高考将至,他们合力为福州学子“保驾护航”!-今日热讯

    2023-06-08

  • 16省份公布去年平均工资:我国中等收入超4亿人 年薪10万起 每日快看

    16省份公布去年平均工资:我国中等收入超4亿人 年薪10万起 每日快看

    2023-06-08

  • 十年暖心相伴 北京链家200余家门店化身“高考服务站”-时快讯

    十年暖心相伴 北京链家200余家门店化身“高考服务站”-时快讯

    2023-06-08

  • 中集来福士获世界级“滚装船技术与环境奖”|天天快报

    中集来福士获世界级“滚装船技术与环境奖”|天天快报

    2023-06-08

  • 焦点报道:欧盟将对实施“经济勒索”的国家加征关税是针对中国?外交部回应

    焦点报道:欧盟将对实施“经济勒索”的国家加征关税是针对中国?外交部回应

    2023-06-08

  • 岳阳兴长:公司惠州项目预计于2023年9月投产 环球实时

    岳阳兴长:公司惠州项目预计于2023年9月投产 环球实时

    2023-06-08

  • 国恩股份:公司专注于新材料纵向一体化平台发展,对于半导体领域业务暂无涉及

    国恩股份:公司专注于新材料纵向一体化平台发展,对于半导体领域业务暂无涉及

    2023-06-08

  • 过桥减持?西菱动力大股东分红前“突击”减持至5%以下,一致行动人神秘消失 环球报资讯

    过桥减持?西菱动力大股东分红前“突击”减持至5%以下,一致行动人神秘消失 环球报资讯

    2023-06-08

  • 每日聚焦:福星股份定增募资不超13.41亿元申请获深交所审核通过

    每日聚焦:福星股份定增募资不超13.41亿元申请获深交所审核通过

    2023-06-08

  • 华泰柏瑞上证红利ETF重仓股唐山港涨7.89%

    华泰柏瑞上证红利ETF重仓股唐山港涨7.89%

    2023-06-08

  • 中欧价值成长混合A重仓股华工科技涨10.01%

    中欧价值成长混合A重仓股华工科技涨10.01%

    2023-06-08