首页 > 编程语言 >【设计模式】原型模式——JDK源码中的原型模式

【设计模式】原型模式——JDK源码中的原型模式

时间:2024-02-02 10:31:44浏览次数:27  
标签:clone other 原型 ArrayList Cloneable new Calendar 设计模式 源码

原型模式在JDK源码中有广泛的应用,想找原型模式的实现也比较容易,只要找Cloneable接口的子类即可。因为JDK源码中Cloneable的子类太多,本文只讨论最典型的几种。


ArrayList

首先看ArrayList和原型模式有关的代码:

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
	/**
     * Returns a shallow copy of this <tt>ArrayList</tt> instance.  (The
     * elements themselves are not copied.)
     */
    public Object clone() {
        try {
            ArrayList<?> v = (ArrayList<?>) super.clone();
            v.elementData = Arrays.copyOf(elementData, size);
            v.modCount = 0;
            return v;
        } catch (CloneNotSupportedException e) {
            // this shouldn't happen, since we are Cloneable
            throw new InternalError(e);
        }
    }
}

注意看注释写的是,clone()方法是一个浅拷贝,ArrayList中的元素并没有被拷贝,而是直接引用。其他的数据结构类比如HashMap、TreeMap、LinkedList等同理。


Calendar

首先看Calendar和原型模式有关的代码:

public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar> { 
	/**
     * Creates and returns a copy of this object.
     *
     * @return a copy of this object.
     */
    @Override
    public Object clone()
    {
        try {
            Calendar other = (Calendar) super.clone();

            other.fields = new int[FIELD_COUNT];
            other.isSet = new boolean[FIELD_COUNT];
            other.stamp = new int[FIELD_COUNT];
            for (int i = 0; i < FIELD_COUNT; i++) {
                other.fields[i] = fields[i];
                other.stamp[i] = stamp[i];
                other.isSet[i] = isSet[i];
            }
            other.zone = (TimeZone) zone.clone();
            return other;
        }
        catch (CloneNotSupportedException e) {
            // this shouldn't happen, since we are Cloneable
            throw new InternalError(e);
        }
    }
}

与前边的数据结构类不同的是,Calendar的clone()方法给生成的新对象的成员变量传递的是旧对象的值的clone()产生的值,而不是引用,这是一种深拷贝。


标签:clone,other,原型,ArrayList,Cloneable,new,Calendar,设计模式,源码
From: https://blog.51cto.com/dongfeng9ge/9543474

相关文章

  • 高德司机端趣接单抢单辅助器源码分享下载 -24软件网
    在网约车行业中,司机端抢单是一项关键的操作,直接关系到司机的订单量和收入。有一些开发者或者个体经营者可能尝试通过编写抢单源码辅助器来提高抢单的效率。然而,这样的做法可能会违反平台规定,涉及到技术伦理和法律风险。本文将介绍司机端抢单源码辅助器的技术实现方式,以及可能面临......
  • 搭建高效企业培训平台:教育系统源码开发详解
    为了更好地满足企业培训的需求,许多组织纷纷转向数字化教育,搭建高效的企业培训平台成为当务之急。本篇文章,小编将为您讲解教育系统源码的开发细节,为搭建一个功能强大、灵活高效的企业培训平台提供详尽的指南。 一、教育系统的基础架构1.1数据库设计众所周知,数据库设计是整个平台的......
  • Striped64源码阅读
    目录简介模型代码分析成员变量方法补充ThreadLocalRandomContended注解-解决伪共享问题参考链接本人的源码阅读主要聚焦于类的使用场景,一般只在java层面进行分析,没有深入到一些native方法的实现。并且由于知识储备不完整,很可能出现疏漏甚至是谬误,欢迎指出共同学习本文基于cor......
  • 基于Java+Neo4j开发的知识图谱+全文检索的知识库管理系统(源码分析)
    在数字化高度普及的时代,企事业机关单位在日常工作中会产生大量的文档,例如医院制度汇编,企业知识共享库等。针对这些文档性的东西,手工纸质化去管理是非常消耗工作量的,并且纸质化查阅难,易损耗,所以电子化管理显得尤为重要。【springboot+elasticsearch+neo4j+vue+activiti】实现数字......
  • 23种设计模式
    https://www.bilibili.com/video/BV1Yr4y157Ci?p=26&spm_id_from=pageDriver&vd_source=26936cf2df4b6c321f63de2ec139cfdc八大原则依赖倒置原则(DIP)•高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定)。•抽象(稳定)不应该依赖于实现细节(变化),实现细......
  • Kubernetes:kube-scheduler 源码分析
    0.前言[译]kubernetes:kube-scheduler调度器代码结构概述介绍了kube-scheduler的代码结构。本文围绕代码结构,从源码角度出发,分析kube-scheduler的调度逻辑。1.启动kube-schedulerkube-scheduler使用Cobra框架初始化参数,配置和应用。//kubernetes/cmd/kube-sche......
  • 【设计模式】设计模式系列总目
    不断更新中……创建型设计模式单例模式【设计模式】单例模式(1)什么是单例模式【设计模式】单例模式(2)单例模式的几种写法【设计模式】单例模式(3)如何用单例模式解决实际问题【设计模式】单例模式(4)单例模式被破坏的情景【设计模式】单例模式(5)JDK源码中的单例模式【设计模式】单例模式(6)A......
  • Mybatis 源码系列:领略设计模式在 Mybatis 其中的应用
    目录一、Builder模式二、工厂模式三、单例模式四、代理模式五、组合模式六、模板方式模式七、适配器模式八、装饰器模式九、迭代器模式虽然我们都知道有23种设计模式,但是大多停留在概念层面,真实开发中很少遇到,Mybatis源码中使用了大量的设计模式,阅读源码并观察设计模式在其中的应......
  • 龙蜥8.6 源码安装python3.12
    ​ 闲来无事用虚拟机安装了一下龙蜥系统。[root@localhosthome]#cat/etc/*release*AnolisOSrelease8.6NAME="AnolisOS"VERSION="8.6"ID="anolis"ID_LIKE="rhelfedoracentos"VERSION_ID="8.6"PLATFORM_ID="platform:an......
  • 用 Python 实现ChatGPT OpenAI(直接上源码)
    网上一大堆教程,好多讲的很墨迹,你需要折腾半天才能调试通,up这里给大家直接上源码干货。详细教程后面补充,着急使用的可以直接拿走调试说明到openai里面替换你自己的app_keyhttps://platform.openai.com/登录账号登录之后,点击右上角“Personal”,展开菜单,找到“ViewAP......