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

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

时间:2024-02-03 11:31:39浏览次数:28  
标签:代码 省略 clone Shape 源码 原型 Intent 设计模式 public

Android SDK源码中很多地方都用到了原型模式


Intent

Intent是Android四大组件之间的桥梁,Intent和原型模式有关的源码如下:

public class Intent implements Parcelable, Cloneable {
    
    // ……代码省略……
    
    /**
     * Copy constructor.
     */
    public Intent(Intent o) {
        this(o, COPY_MODE_ALL);
    }

    private Intent(Intent o, @CopyMode int copyMode) {
        this.mAction = o.mAction;
        this.mData = o.mData;
        this.mType = o.mType;
        this.mIdentifier = o.mIdentifier;
        this.mPackage = o.mPackage;
        this.mComponent = o.mComponent;
        this.mOriginalIntent = o.mOriginalIntent;

        // ……代码省略……
    }
    
	@Override
    public Object clone() {
        return new Intent(this);
    }
    
    // ……代码省略……
}

可见Intent实现了Cloneable接口,也重写了clone()方法,但和我们平时使用的 clone() 方法的方式不一样,Intent 类并没有调用 super.clone() ,而是专门写了一个构造函数用来拷贝对象,使用 clone() 或直接new 需要根据构造函数的成本来决定,如果对象的构造成本比较高或者构造较为麻烦,那么使用 clone 函数效率较高,否则可以直接使用 new 的形式。


Bundle

Bundle主要用于在Activity之间传输数据,它保存的数据,是以key-value的形式存储的。Bundle与原型模式相关的代码如下:

public final class Bundle extends BaseBundle implements Cloneable, Parcelable {

    // ……代码省略……
    
  	/**
     * Clones the current Bundle. The internal map is cloned, but the keys and
     * values to which it refers are copied by reference.
     */
    @Override
    public Object clone() {
        return new Bundle(this);
    }

    // ……代码省略……
}

可见Bundle实现原型模式的原理与Intent类似,不做过多解释。


Shape及其子类

Shape类源码如下:

/**
 * Defines a generic graphical "shape."
 * <p>
 * Any Shape can be drawn to a Canvas with its own draw() method, but more
 * graphical control is available if you instead pass it to a
 * {@link android.graphics.drawable.ShapeDrawable}.
 * <p>
 * Custom Shape classes must implement {@link #clone()} and return an instance
 * of the custom Shape class.
 */
public abstract class Shape implements Cloneable {
    
    // ……代码省略……

    @Override
    public Shape clone() throws CloneNotSupportedException {
        return (Shape) super.clone();
    }

    // ……代码省略……
}

注意注释写的是Shape的每个子类必须重写clone()方法,返回具体子类的一个实例。Shape类的子类RectShape类源码如下:

public class RectShape extends Shape {
    // ……代码省略……

    @Override
    public RectShape clone() throws CloneNotSupportedException {
        final RectShape shape = (RectShape) super.clone();
        shape.mRect = new RectF(mRect);
        return shape;
    }

    // ……代码省略……
}

可见RectShape的clone()方法返回的是RectShape实例。


Animation

Animation类与原型模式有关的源码如下:

与Shape类不同的是,Animation类的子类都没有实现Cloneable接口,也都没有重写clone()方法。


SparseArray

SparseArray是Android中特有的数据结构,小巧却精悍,其中与原型模式有关的代码如下:

public class SparseArray<E> implements Cloneable {
    private int[] mKeys;
    private Object[] mValues;
    
    // ……代码省略……

    @Override
    @SuppressWarnings("unchecked")
    public SparseArray<E> clone() {
        SparseArray<E> clone = null;
        try {
            clone = (SparseArray<E>) super.clone();
            clone.mKeys = mKeys.clone();
            clone.mValues = mValues.clone();
        } catch (CloneNotSupportedException cnse) {
            /* ignore */
        }
        return clone;
    }
    
    // ……代码省略……

}

可见clone()方法里边,两个数组mKeys和mValues也分别调用了clone()方法,这是一种最基础的深拷贝。为什么说是最基础的深拷贝呢?因为仅仅两个Array实现了深拷贝,而Array中的元素并没有实现。



标签:代码,省略,clone,Shape,源码,原型,Intent,设计模式,public
From: https://blog.51cto.com/dongfeng9ge/9569002

相关文章

  • SAP 批量写入自建表数据 源码
    使用的时候修改对应的参考的表结构即可,针对不同的自建表以及excel数据,修改ALSM_EXCEL_TO_INTERNAL_TABLE的起始行列和结束行列*&---------------------------------------------------------------------**&ReportY_PNJ_DEMO07*&-----------------------------------------......
  • 短视频源码实现流式传输,降低处理大文件时对内存的占用
    短视频源码实现流式传输,降低处理大文件时对内存的占用其实当使用Node.js向短视频源码客户端返回大文件时,我们最好使用流的形式来返回文件流,这样能避免处理大文件时,占用过多的内存。具体实现方式如下所示:constfs=require("fs");constzlib=require("zlib");consthtt......
  • 短视频源码,实现预处理防止客户端频繁请求
    Go语言实现在Go语言中,使用db.Prepare()方法实现预处理:func(db*DB)Prepare(querystring)(*Stmt,error)Prepare执行预处理SQL语句,并返回Stmt结构体指针,进行数据绑定操作。查询操作使用db.Prepare()方法声明预处理SQL,使用stmt.Query()将数据替换占位......
  • [Flink] Flink源码分析 : BoundedOutOfOrdernessTimestampExtractor
    0序言0.1缘起importorg.apache.flink.api.common.functions.MapFunction;importorg.apache.flink.api.java.tuple.Tuple;importorg.apache.flink.api.java.tuple.Tuple3;importorg.apache.flink.configuration.Configuration;importorg.apache.flink.configuration.......
  • Pytest 源码解读 [7] - PyTest on pluggy
    之前花了很多篇幅来介绍 pluggy 这个插件框架。核心原因就是因为其实 pytest 是一个完全基于 pluggy 开发的测试框架,这个也可以解释为什么说 pytest 是一个很灵活的测试框架,支持很多插件(https://docs.pytest.org/en/7.0.x/reference/plugin_list.html)。 其实原因就......
  • 在ubuntu16.04下,源码编译安装特定版本的MongoDB PHP扩展
    背景:我的php项目在连接其他mongo库时报:Serveratxxx:27017reportswireversion5,butthisversionoflibmongocrequiresatleast6(MongoDB3.6)原因:本地MongoDBPHP扩展的版本过高解决方法:降低本地PHP扩展MongoDB版本,现在要降到mongodb-1.12.0版本步骤:1:下载......
  • Java设计模式_1(10/23)
    Java设计模式_1(10/23)目录Java设计模式_1(10/23)单例模式定义饿汉式懒汉式懒汉式(双重检查锁)简单工厂模式定义代码优点缺点工厂模式定义抽象工厂模式装饰器模式适配器模式观察者模式定义外观模式定义状态模式定义策略模式定义代理模式单例模式定义确保类只有一个实例,而且自行......
  • 设计模式浅析(一) ·策略模式
    设计模式浅析(一)·策略模式日常叨逼叨java设计模式浅析,如果觉得对你有帮助,记得一键三连,谢谢各位观众老爷......
  • WPF 客户端设计(MVVM设计模式)
    WPF(WindowsPresentationFoundation)是微软推出的基于Windows的用户界面框架。在这里我设计了一份以MVVM设计模式下的纯桌面端应用架构,期间包含界面初始化流程,菜单加载及页面跳转流程等。以下来详细说明下设计方式:期间项目使用到了我自己上传到Nuget的包:目录1:启动2:主界面2.1......
  • 【设计模式】原型模式——JDK源码中的原型模式
    原型模式在JDK源码中有广泛的应用,想找原型模式的实现也比较容易,只要找Cloneable接口的子类即可。因为JDK源码中Cloneable的子类太多,本文只讨论最典型的几种。ArrayList首先看ArrayList和原型模式有关的代码:publicclassArrayList<E>extendsAbstractList<E>implementsL......