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

这篇具有很好参考价值的文章主要介绍了如何以孙悟空七十二变去理解原型模式?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

一.什么是原型模式

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

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

下一章,将带大家学习市场供需关系(设计模式之生产者和消费者模式)。文章来源地址https://www.toymoban.com/news/detail-474496.html


到了这里,关于如何以孙悟空七十二变去理解原型模式?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一百七十二、Flume——Flume采集Kafka数据写入HDFS中(亲测有效、附截图)

    作为日志采集工具Flume,它在项目中最常见的就是采集Kafka中的数据然后写入HDFS或者HBase中,这里就是用flume采集Kafka的数据导入HDFS中 kafka_2.13-3.0.0.tgz hadoop-3.1.3.tar.gz apache-flume-1.9.0-bin.tar.gz # cd  /home/hurys/dc_env/flume190/conf # vi  evaluation.properties ### Name agent, source, channels and sink ali

    2024年02月09日
    浏览(48)
  • [Python从零到壹] 七十二.图像识别及经典案例篇之OpenGL入门及绘制基本图形和3D图

    十月太忙,还是写一篇吧!祝大家1024节日快乐O(∩_∩)O 欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家

    2024年02月06日
    浏览(53)
  • “悟空网盘”操作教程(保姆级),“星子助推”小程序操作方法教程

    1、网盘有着天然的传播优势:网盘的便利性、效率和安全性,使得个人能够更加轻松地存储、共享和管理数据。 2、便捷性:网盘允许用户随时随地上传和下载文件,只要有互联网连接,用户就可以访问和分享文件,大大提升了传播的便利性。 3、 大容量存储:与传统的物理

    2024年02月22日
    浏览(400)
  • 沪上十二少-浅谈“交易如何进场”

    今天和大家分享一下“交易进场的问题”。 用黑色来举个例子吧,螺纹钢和铁矿石这两个标的,2020年从开年至今我都是一个方向——做多,但上周我开始做空了。我一个做基本面的学生跟我说,他在黑色上因为多头思维太重了,所以空头做的战战兢兢。这是事实,很多交易

    2024年02月03日
    浏览(33)
  • android 如何分析应用的内存(十二)——HWASan

    上一篇介绍了ASan,这次介绍ASan的加强版HWASan 从NDK r21和Android 10 开始,Android支持HWAsan。HWAsan仅仅支持arm64架构的设备。 HWASan需要系统的支持,因此,需要重新编译系统镜像。可以是android模拟器,也可以是真机。 本次实验,选择了Pixel3的真机作为演示。同时使用了android-12.0

    2024年02月15日
    浏览(42)
  • 第二百三十二回 如何通过相机获取图片文件

    我们在上一章回中介绍了\\\"如何混合选择多个图片和视频文件\\\"相关的内容,本章回中将介绍 如何通过相机获取图片文件 .闲话休提,让我们一起Talk Flutter吧。 我们在前面章回中介绍的选择图片或者视频文件的方式都是通过文件窗口进行的,本章回中将介绍如何通过相机获取图

    2024年02月20日
    浏览(53)
  • 十二、MySQL(DQL)分组/排序/分页查询如何实现?

    (1)基础语法: (2)注意事项: (3)理解:          select后的“字段列表”是由from后的参数决定的,where的执行时间在分组操作之前,having的执行时间在分组操作之后。 执行时间:where分组操作having 新的数据类型 (1)根据性别分组,并统计男女员工的数量 (2)根

    2024年02月10日
    浏览(44)
  • 目标检测笔记(十二):如何通过界面化操作YOLOv5完成数据集的自动标注

    通过界面化操作YOLOv5完成数据集的自动标注的意义在于简化数据标注的流程,提高标注的效率和准确性。 传统的数据集标注通常需要手动绘制边界框或标记关键点,这个过程费时费力且容易出错。而通过界面化操作YOLOv5完成数据集的自动标注,可以实现自动识别目标并生成标

    2024年02月11日
    浏览(41)
  • 第二百七十七回

    我们在上一章回中介绍了\\\"DropdownMenu组件\\\"相关的内容,本章回中将介绍DropdownButton组件.闲话休提,让我们一起Talk Flutter吧。 我们在本章回中介绍的DropdownButton组件和上一章回中介绍的DropdownMenu组件类似,主要用来实现下拉菜单,不过该组件在外观上像一个带图标的按钮, 点击

    2024年01月21日
    浏览(49)
  • 真题详解(哈希冲突)-软件设计(七十)

    真题详解(3FN)-软件设计(六十九) https://blog.csdn.net/ke1ying/article/details/130548812 在以阶段划分的编译器,____阶段的主要作用是分析构成程序的 字符 及由 字符构造规则构成的符号 是否 复合程序语言 的规定。 词法分析 B.语法分析 C.语义分析 D.代码生成 解析: 选择A 在windows命令

    2024年02月03日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包