当前位置: 首页 > news >正文

我理解的原型模式

背景

原型模式也是一种创建模式,它主要通过复制一个对象来创建一个新的对象。 原型类需要满足两个条件:

  • 实现Cloneable接口,只有实现了这个接口的类才能被拷贝,否则会抛出CloneNotSupportedException异常。
  • 重写Object类中的clone方法,因为Object类中的clone方法是protect,因此原型类需要重写,将clone方法改为public

示例代码

如下:

public class ProtoType implements Cloneable {
    public void show() {
        System.out.println("hahaha");
    }
    @Override
    protected ProtoType clone() {
        ProtoType protoType = null;
        try {
            protoType = (ProtoType)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return protoType;
    }
}
复制代码

客户端调用

public class Main {
    public static void main(String[] args) {
        ProtoType protoType = new ProtoType();
        ProtoType clone = protoType.clone();
        clone.show();
    }
}
复制代码

适用场景

    protected native Object clone() throws CloneNotSupportedException;
复制代码

Object类中的clone方法是一个native方法,直接操作内存中的二进制流,所以在构建复杂大对象的时候,会比new一个对象快。

注意事项

  • 使用clone方法不会调用类的构造方法。
  • Object中的clone方法是浅拷贝,如果想要实现深拷贝,需要自己实现。 最简单的深拷贝方式直接序列化,然后反序列化

相关文章:

  • BZOJ-1497 最大获利
  • 【原创】如何写一个框架:步骤(上)
  • 深入理解JS执行上下文的点点滴滴
  • MySQL索引原理及慢查询优化,了解一下?
  • [BZOJ 3282] Tree 【LCT】
  • npm script 一见钟情
  • 团队项目之典型用户
  • C++笔记(1)——Anniversary
  • 【第43题】【062题库】2019年OCP认证062考试新题
  • 自我调查 使用输入法
  • linux轻量级监控工具-nmon
  • js基础---变量命名以及运算符
  • JS 原型、原型继承、原型链的理解
  • Linux 双网卡绑定
  • Docker 的基本概念和框架
  • 30天自制操作系统-2
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • React-Native - 收藏集 - 掘金
  • 大型网站性能监测、分析与优化常见问题QA
  • 当SetTimeout遇到了字符串
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 日剧·日综资源集合(建议收藏)
  • 什么是Javascript函数节流?
  • 无服务器化是企业 IT 架构的未来吗?
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • postgresql行列转换函数
  • 如何用纯 CSS 创作一个货车 loader
  • ​​​【收录 Hello 算法】9.4 小结
  • ​queue --- 一个同步的队列类​
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • (1)SpringCloud 整合Python
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (六)软件测试分工
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (译)计算距离、方位和更多经纬度之间的点
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET BackgroundWorker
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net core 6 redis操作类
  • .NET 反射的使用
  • .net 受管制代码
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET开发人员必知的八个网站
  • .NET框架
  • .NET应用架构设计:原则、模式与实践 目录预览
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • .考试倒计时43天!来提分啦!
  • :中兴通讯为何成功
  • @NestedConfigurationProperty 注解用法
  • [1204 寻找子串位置] 解题报告
  • [8] CUDA之向量点乘和矩阵乘法