Java设计模式之原型设计示例详解

 更新时间:2022年04月06日 17:06:12   作者:Thinkao~  
这篇文章主要为大家详细介绍了Java的原型设计模式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

简单说一下(定义)

什么是原型模式:原型模式是用于创建重复的对象,同时又能保证性能。用一个已经创建的实例作为原型,通过复制该原型对象来创建一个或者多个和原型相同或者相似的新对象

举例说明:我们都玩过打飞机的游戏,敌军的飞机可谓是数不胜数,但是如果每出一架敌机都要重新实例化的话,那么自然我们的功能很复杂。所以这个时候我们的原型模式就派上用场了,只实例化一架飞机出来,其他的照着他复制就可以啦

稍微夸一下(优缺点)

原型模式优点:

1.当创建新的对象实例比较复杂时,使用原型模式通过一个已有实例可以提高新实例创建效率
2.可以动态增加或者减少产品类
3.原型模式提供了简单的创建结构
4.可以使用深克隆的方式保存对象的状态

原型模式缺点:
1.对已有类进行改造时,必须修改其源码,违背了开闭原则
2.在实现深克隆时需要编写较为复杂的代码

顺便提一下(适用场景)

原型模式的适用场景:
1.对象种类繁多,无法将他们整合到一个类的时候
2.难以根据类生成实例时
3.想解耦框架与生成的实例时

着重讲一下(深、浅克隆)

在原型模式中有两个概念需要讲下,就是深克隆与浅克隆。顾名思义浅克隆只是复制了基础属性(如八大基本类型),然而引用类型实际上没有复制,只是将对应的引用给复制了(复制地址)。
 

浅克隆:如果原型对象的成员变量是值类型(如八大基本类型),那么就是直接复制;如果是复杂的类型,就只是复制对应的内存地址。(网上当个图)
换言之,就是复杂类型的成员变量(String,枚举等)用的是一个,修改了克隆对象的原型对象也会,他们是共用的(类似于响应式)。而值类型不是共用的。

在这里插入图片描述

深克隆:深克隆就是什么都是单独的,全部复制,复制之后的全部各自独立。修改克隆对象对于原型对象没有任何影响(浅克隆中修改克隆对象,原型对象跟着变)。

在这里插入图片描述

多多用一下(结构、代码实现)

模式结构

原型模式主要包含三个部分:具体原型类、抽象原型类、访问类
具体原型类:实现抽象原型类的clone()方法,是可被复制的对象
抽象原型类:规定了具体原型对象必须实现的接口
访问类:使用具体原型类中的clone()方法类复制新的对象
一图走天下:

在这里插入图片描述

代码实现

1.创建具体原型类RealizeType.java

public class RealizeType implements Cloneable {
    RealizeType(){
        System.out.println("原型创建成功");
    }
    public Object clone() throws CloneNotSupportedException {
        System.out.println("具体原型复制成功");
        return super.clone();
    }
}

2.原型模式测试类PrototypeTest.java

public class PrototypeTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        RealizeType obj = new RealizeType();
        RealizeType obj1 = (RealizeType) obj.clone();
        System.out.println("obj==obj1?"+(obj==obj1));
    }
}

3.运行结果

原型创建成功
具体原型复制成功
obj==obj1?false

以上就是Java设计模式之原型设计示例详解的详细内容,更多关于Java原型设计模式的资料请关注脚本之家其它相关文章!

相关文章

  • Spring解决依赖版本不一致报错问题

    Spring解决依赖版本不一致报错问题

    许多同学经常会遇到依赖版本不一致导致代码报错,所以这篇文章就给大家详细介绍一下Spring解决依赖版本不一致报错问题,需要的朋友跟着小编一起来看看吧
    2023-07-07
  • springboot使用消息中间件

    springboot使用消息中间件

    这篇文章主要介绍了springboot使用消息中间件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 详解Java如何实现百万数据excel导出功能

    详解Java如何实现百万数据excel导出功能

    这篇文章主要为大家详细介绍了Java如何实现百万数据excel导出功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2023-02-02
  • Java实现序列化与反序列化的简单示例

    Java实现序列化与反序列化的简单示例

    序列化与反序列化是指Java对象与字节序列的相互转换,一般在保存或传输字节序列的时候会用到,下面有两个Java实现序列化与反序列化的简单示例,不过还是先来看看序列和反序列化的具体概念:
    2016-05-05
  • Java中实现文件预览的功能(实例代码)

    Java中实现文件预览的功能(实例代码)

    大家都知道word,Excel,PPT实现在线预览常用的方式就是先转换成pdf,然后在进行预览,下面给大家介绍Java中如何实现文件预览的功能,需要的朋友可以参考下
    2023-05-05
  • 详解MyBatis特性之动态SQL

    详解MyBatis特性之动态SQL

    动态 SQL 是 MyBatis 的强大特性之一,这篇文章我们将结合动态SQL完成更加复杂的 SQL 操作,文章通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • yaml配置对象map使用示例

    yaml配置对象map使用示例

    这篇文章主要为大家介绍了yaml配置对象map使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Java语言实现快速幂取模算法详解

    Java语言实现快速幂取模算法详解

    这篇文章主要介绍了Java语言实现快速幂取模算法详解,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • MyBatis实现多表联合查询resultType的返回值

    MyBatis实现多表联合查询resultType的返回值

    这篇文章主要介绍了MyBatis多表联合查询resultType的返回值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringBoot实现API接口的完整代码

    SpringBoot实现API接口的完整代码

    这篇文章主要给大家介绍了关于SpringBoot实现API接口的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10

最新评论