返回顶部
首页 > 资讯 > 后端开发 > Python >Java 设计模式以虹猫蓝兔的故事讲解原型模式
  • 426
分享到

Java 设计模式以虹猫蓝兔的故事讲解原型模式

2024-04-02 19:04:59 426人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录什么是原型模式优点缺点应用场景浅克隆代码实现总结深克隆代码实现总结什么是原型模式 原型(Prototype)模式的定义如下: 用一个已经创建的实例作为原型,通过复制该原型对象来创

什么是原型模式

原型(Prototype)模式的定义如下: 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。例如,windows 操作系统的安装通常较耗时,如果复制就快了很多。在生活中复制的例子非常多,这里不一一列举了。

优点

1、Java 自带的原型模式基于内存二进制流的复制,在性能上比直接 new 一个对象更加优良。

2、可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份,并将其状态保存起来,简化了创建对象的过程,以便在需要的时候使用(例如恢复到历史某一状态),可辅助实现撤销操作。

缺点

1、需要为每一个类都配置一个 clone 方法

2、clone 方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违背了开闭原则。

3、当实现深克隆时,需要编写较为复杂的代码,而且当对象之间存在多重嵌套引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来会比较麻烦。因此,深克隆、浅克隆需要运用得当。

应用场景

在有些系统中,存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂且耗时耗资源,用原型模式生成对象就很高效,就像孙悟空拔下猴毛轻轻一吹就变出很多孙悟空一样简单。

浅克隆

案例:克隆虹猫

浅克隆一个虹猫,外表特征一样,但是只有一个灵魂。

克隆虹猫身体受到伤害,本体虹猫不受影响。

克隆虹猫精神受到伤害,本体虹猫也受到同样的伤害。

代码实现

虹猫灵魂状态类

这里声明了虹猫的灵魂状态

public class Hong {
    //虹猫的灵魂状态
    private String lh;
    Hong(String lh) {
        this.lh = lh;
    }
    Hong() {
    }

    public String getLh() {
        return lh;
    }

    public void setLh(String lh) {
        this.lh = lh;
    }

}

虹猫个体类

实现了Cloneable 接口,并且有虹猫的身体状态和灵魂状态等属性。

public class Qian implements Cloneable {
    private String shou;
    private String jiao;
    private String yan;
    private Hong hong;

    Qian() {
    }

    Qian(String shou, String jiao, String yan, Hong hong) {
        this.hong = hong;
        this.shou = shou;
        this.jiao = jiao;
        this.yan = yan;
    }

    public Qian clone() throws CloneNotSupportedException {
        return (Qian) super.clone();
    }

    public String getShou() {
        return shou;
    }

    public void setShou(String shou) {
        this.shou = shou;
    }

    public String getJiao() {
        return jiao;
    }

    public void setJiao(String jiao) {
        this.jiao = jiao;
    }

    public String getYan() {
        return yan;
    }

    public void setYan(String yan) {
        this.yan = yan;
    }

    public Hong getHong() {
        return hong;
    }

    public void setHong(Hong hong) {
        this.hong = hong;
    }

}

测试

这里测试一下浅克隆的效果:

浅克隆一个虹猫,外表特征一样,但是只有一个灵魂。

克隆虹猫身体受到伤害,本体虹猫不受影响。

克隆虹猫精神受到伤害,本体虹猫也受到同样的伤害。

public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        Qian qian = new Qian("两只手", "两只脚", "两只眼", new Hong("完整的灵魂"));
        Qian qian1 = qian.clone();
        System.out.printf("虹猫少侠本体的身体状态:%s,%s,%s,%s,", qian.getHong().getLh(), qian.getJiao(), qian.getShou(), qian.getYan());
        System.out.println();
        System.out.printf("虹猫少侠一号的身体状态:%s,%s,%s,%s,", qian1.getHong().getLh(), qian1.getJiao(), qian1.getShou(), qian1.getYan());

    }
}

克隆出来了一个虹猫一号,所有属性都一模一样

在这里插入图片描述

public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        Qian qian = new Qian("两只手", "两只脚", "两只眼", new Hong("完整的灵魂"));
        Qian qian1 = qian.clone();
        qian1.getHong().setLh("灵魂受到攻击");
        qian1.setJiao("断了一只脚");
        System.out.printf("虹猫少侠本体的身体状态:%s,%s,%s,%s,", qian.getHong().getLh(), qian.getJiao(), qian.getShou(), qian.getYan());
        System.out.println();
        System.out.printf("虹猫少侠一号的身体状态:%s,%s,%s,%s,", qian1.getHong().getLh(), qian1.getJiao(), qian1.getShou(), qian1.getYan());
    }
}

这里克隆虹猫的脚和灵魂都受到了伤害,本体虹猫的身体没有受到影响,但是灵魂却受到了伤害。

在这里插入图片描述

总结

一、为什么浅克隆中虹猫一号的脚受到了伤害,本体虹猫却没受到伤害?

二、为什么浅克隆中虹猫一号的灵魂受到了伤害,本体虹猫也受到了伤害?

因为创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。 两个虹猫的灵魂指向同一个内存地址,所以存储的是同一个灵魂。

深克隆

案例:克隆虹猫

深克隆一个虹猫,外表特征一样,都有独立灵魂。

克隆虹猫身体受到伤害,本体虹猫不受影响。

克隆虹猫精神受到伤害,本体虹猫也不受影响。

代码实现

虹猫灵魂状态类

这里声明了虹猫的灵魂状态,并且实现了Cloneable 接口,克隆一个虹猫灵魂

public class Hong implements Cloneable {
    //虹猫的灵魂状态
    private String lh;

    Hong(String lh) {
        this.lh = lh;
    }

    Hong() {
    }

    public Hong clone() throws CloneNotSupportedException {
        return (Hong) super.clone();
    }

    public String getLh() {
        return lh;
    }

    public void setLh(String lh) {
        this.lh = lh;
    }

}

虹猫个体类

重写了clone方法,在clone方法中调用了hong.clone()方法克隆了一个虹猫灵魂

public class Qian implements Cloneable {
    private String shou;
    private String jiao;
    private String yan;
    private Hong hong;

    Qian() {
    }

    Qian(String shou, String jiao, String yan, Hong hong) {
        this.hong = hong;
        this.shou = shou;
        this.jiao = jiao;
        this.yan = yan;
    }

    public Qian clone() throws CloneNotSupportedException {
        Qian qian = (Qian) super.clone();
        hong = hong.clone();
        return qian;

    }

    public String getShou() {
        return shou;
    }

    public void setShou(String shou) {
        this.shou = shou;
    }

    public String getJiao() {
        return jiao;
    }

    public void setJiao(String jiao) {
        this.jiao = jiao;
    }

    public String getYan() {
        return yan;
    }

    public void setYan(String yan) {
        this.yan = yan;
    }

    public Hong getHong() {
        return hong;
    }

    public void setHong(Hong hong) {
        this.hong = hong;
    }

}

测试类

这里测试一下浅克隆的效果:

深克隆一个虹猫,外表特征一样,都有独立灵魂。

克隆虹猫身体受到伤害,本体虹猫不受影响。

克隆虹猫精神受到伤害,本体虹猫也不受影响。

public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        Qian qian = new Qian("两只手", "两只脚", "两只眼", new Hong("完整的灵魂"));
        Qian qian1 = qian.clone();
        qian1.getHong().setLh("灵魂受到攻击");
        qian1.setJiao("断了一只脚");
        System.out.printf("虹猫少侠本体的身体状态:%s,%s,%s,%s,", qian.getHong().getLh(), qian.getJiao(), qian.getShou(), qian.getYan());
        System.out.println();
        System.out.printf("虹猫少侠一号的身体状态:%s,%s,%s,%s,", qian1.getHong().getLh(), qian1.getJiao(), qian1.getShou(), qian1.getYan());
    }
}

在这里插入图片描述

深克隆出的虹猫完全是个独立的个体,再也不用受限制了。

总结

深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。

到此这篇关于Java 设计模式以虹猫蓝兔的故事讲解原型模式的文章就介绍到这了,更多相关Java 原型模式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java 设计模式以虹猫蓝兔的故事讲解原型模式

本文链接: https://lsjlt.com/news/145525.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java 设计模式以虹猫蓝兔的故事讲解原型模式
    目录什么是原型模式优点缺点应用场景浅克隆代码实现总结深克隆代码实现总结什么是原型模式 原型(Prototype)模式的定义如下: 用一个已经创建的实例作为原型,通过复制该原型对象来创...
    99+
    2024-04-02
  • Java 设计模式以虹猫蓝兔的故事讲解单例模式
    目录专栏介绍本期介绍什么是单例模式懒汉式一正常模式单例模式为什么线程不安全呢懒汉式二为什么线程安全呢饿汉式懒汉式与饿汉式的区别专栏介绍 【JAVA长虹键法】 主要讲了23种设计模式,...
    99+
    2024-04-02
  • Java设计模式以虹猫蓝兔的故事讲解桥接模式
    目录什么是桥接模式优点缺点知识点桥接模式实现颜色黄色红色裙子长裙短裙测试总结模式: 桥接模式 案例: 蓝兔宫主买裙子 什么是桥接模式 桥接(Bridge)模式的定义如下: 将抽象与实...
    99+
    2024-04-02
  • Java设计模式以虹猫蓝兔的故事讲解代理模式
    目录什么是代理模式优点缺点知识点代理模式实现卖酒干娘的酒馆大奔的酒摊测试总结模式: 代理模式 案例: 大奔代干娘卖酒 什么是代理模式 代理模式的定义: 由于某些原因需要给某对象提供一...
    99+
    2024-04-02
  • Java设计模式以虹猫蓝兔的故事讲解建造者模式
    目录什么是建造者模式优点缺点知识点建造者模式实现丹药抽象丹方九转仙丹丹方太虚化神丹丹方神医豆豆测试总结什么是建造者模式 建造者(Builder)模式的定义: 指将一个复杂对象的构造与...
    99+
    2024-04-02
  • Java设计模式以虹猫蓝兔的故事讲解装饰器模式
    目录什么是装饰器模式优点缺点知识点装饰器模式实现七侠虹猫加料加盐加孜然测试总结模式: 装饰器模式 案例: 黑小虎抓住了七侠,把虹猫烤了 什么是装饰器模式 装饰器(Decorator)...
    99+
    2024-04-02
  • Java设计模式以虹猫蓝兔的故事讲解适配器模式
    目录什么是适配器模式优点缺点知识点适配器模式实现类适配器长虹剑气火舞旋风剑气火晶石测试对象适配器长虹剑气火舞旋风剑气火晶石测试总结模式: 适配器模式 案例: 虹猫利用火晶石催发火舞旋...
    99+
    2024-04-02
  • Java 设计模式以虹猫蓝兔的故事讲解简单工厂模式
    目录专栏介绍本期介绍什么是简单工厂模式优点缺点应用场景简单工厂的实现专栏介绍 本系列专栏会以虹猫蓝兔七侠传的故事为例来给大家详细分析所有模式,希望能给大家带来帮助! 本期介绍 模式:...
    99+
    2024-04-02
  • Java设计模式中的原型模式讲解
    目录介绍原型模式深拷贝与浅拷贝原型模式代码总结介绍 原型模式 在Java中,原型模式是一种创建型设计模式,它允许通过复制一个现有对象来创建一个新对象,而不是通过创建新的对象来初始化一...
    99+
    2023-05-18
    Java 原型设计模式 Java 设计模式 Java 原型模式
  • Java 超详细讲解设计模式之原型模式讲解
    目录传统方式原型模式基本介绍原型模式在spring框架中源码分析深入讨论-浅讨论和深拷贝原型模式的注意事项和细节传统方式 克隆羊问题 现在有一只羊 tom,姓名为: tom,年龄为:...
    99+
    2024-04-02
  • java设计模式--原型模式详解
    目录引例原型模式浅拷贝在原先Sheep类基础上实现Cloneable接口,重写clone方法。客户端调用Sheep类新添的Cow类客户端调用克隆深拷贝1.Cow类也实现Cloneab...
    99+
    2024-04-02
  • Golang设计模式之原型模式详细讲解
    目录原型模式概念示例原型模式 原型是一种创建型设计模式, 使你能够复制对象, 甚至是复杂对象, 而又无需使代码依赖它们所属的类。 所有的原型类都必须有一个通用的接口, 使得即使在对象...
    99+
    2023-01-11
    Go原型模式 Go设计模式
  • java设计模式:原始模型模式
    目录什么是原始模型模式原始模型模式中的角色抽象原型角色(Prototype)具体原型角色(ConcretePrototype)A...
    99+
    2024-04-02
  • Java设计模式之java原型模式详解
    目录介绍角色Java语言提供的clone()方法代码演示—克隆羊结论深浅拷贝深浅拷贝探讨实现深克隆的方式一 : 手动对引用对象进行克隆实现深克隆的方式一 :序列化原型模式对单例模式的...
    99+
    2024-04-02
  • Java设计模式之原型模式详解
    目录一、前言二、优点及适用场景三、原型模式的注意事项四、浅复制和深复制五、浅复制demo演示六、深复制demo演示一、前言 原型模式是一种比较简单的模式,也非常容易理解,实现一个接口...
    99+
    2024-04-02
  • Java设计模式的事件模型详解
    目录监听模式参与的角色事件、事件源、监听器之间的关系举个粒子总结监听模式 事件模型实现了监听模式,监听模式简单来说就是事件源经过事件的封装传给监听器,当事件源触发事件后,监听器接收到...
    99+
    2024-04-02
  • 怎么理解Java设计模式的原型模式
    本篇内容主要讲解“怎么理解Java设计模式的原型模式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解Java设计模式的原型模式”吧!一、前言单例模式可以避免重复创建消耗资源的对象,但是却不...
    99+
    2023-06-25
  • JAVA设计模式---原型模式你了解吗
    目录介绍角色Java语言提供的clone()方法代码演示—克隆羊结论深浅拷贝深浅拷贝探讨实现深克隆的方式一 : 手动对引用对象进行克隆实现深克隆的方式二 :序列化原型模式对单例模式的...
    99+
    2024-04-02
  • Java设计模式之原型模式的示例详解
    目录定义案例需求方案一方案二对比分析总结 定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 即实现了一个原型接口,该接口用于创建当前对象的克隆,当直接创建对象的代...
    99+
    2024-04-02
  • 深入理解Java设计模式之原型模式
    目录一、前言二、什么是原型模式三、原型模式的适用场景四、原型模式的实现1.浅拷贝实现2.深拷贝实现五、总结一、前言 单例模式可以避免重复创建消耗资源的对象,但是却不得不共用对象。若是...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作