如何通过原型模式在Android编程中实现对象复制?

Android编程设计模式之原型模式实例详解

如何通过原型模式在Android编程中实现对象复制?

一、原型模式

原型模式是一种创建型设计模式,它通过复制现有的对象来创建新的对象,这种模式的核心思想是“克隆”,即通过创建一个对象的副本(克隆)而非从头开始构建,以节省资源和时间,特别是在对象创建复杂或耗时的情况下。

二、原型模式的定义

用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象,原型模式允许开发者通过复制现有对象来快速创建新的实例,而无需重新初始化所有属性。

三、使用场景

1、类初始化需要消耗大量资源:例如处理大量数据或硬件交互,通过原型拷贝可以避免这些资源的重复消耗。

2、对象创建过程繁琐:当创建一个对象需要繁琐的数据准备或访问权限时,原型模式提供了一种快速的替代方案。

3、保护性拷贝:当多个用户需要同时修改一个对象时,可以通过原型模式提供多个独立的副本,以避免数据冲突。

如何通过原型模式在Android编程中实现对象复制?

四、注意事项

需要注意的是,并非所有实现Cloneable接口的对象通过clone方法都会比new操作更快,只有当new操作成本较高时才会有性能优势,实现原型模式也不一定非要实现Cloneable接口,也有其他的实现方式。

五、原型模式的UML类图

Client:客户端用户。

Prototype:抽象类或者接口,声明具备clone能力。

ConcretePrototype:具体的原型类。

六、原型模式的简单实现

下面以一个简单的文档拷贝为例来演示一下简单的原型模式,我们在这个例子中首先创建了一个文档对象WordDocument,这个文档中含有文字和图片,用户经过了长时间的内容编辑后,打算对该文档做进一步的编辑,这个编辑后的文档是否会被采用还不确定,为了安全起见,用户需要将当前文档拷贝一份,然后再在文档副本上进行修改,这与《Effective Java》一书中提到的保护性拷贝有些类似,这个原始文档就是我们上述所说的样板实例,也就是将要被“克隆”的对象,我们成为原型。

如何通过原型模式在Android编程中实现对象复制?

示例代码

public class WordDocument implements Cloneable {
    //文本
    private String mText;
    //图片名列表
    private ArrayList<String> mImages = new ArrayList<>();
    public WordDocument() {
        System.out.println("-------WordDocument构造函数 ---------");
    }
    @Override
    protected WordDocument clone() {
        WordDocument document;
        try {
            document = (WordDocument) super.clone();
            document.mText = this.mText;
            document.mImages = new ArrayList<>(this.mImages); // 深拷贝
            return document;
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
    public String getText() {
        return this.mText;
    }
    public void setText(String text) {
        this.mText = text;
    }
    public void addImage(String img) {
        this.mImages.add(img);
    }
    public void showDocument() {
        System.out.println("Text : " + mText + " Images : " + mImages.toString());
    }
}

Client使用

public static void main(String[] args) {
    WordDocument wordDocument = new WordDocument();
    wordDocument.setText("这是一篇文档!");
    wordDocument.addImage("图片一");
    wordDocument.addImage("图片二");
    wordDocument.addImage("图片三");
    wordDocument.addImage("图片四");
    wordDocument.showDocument();
    //以原始文档为原型,拷贝一份副本
    WordDocument wordDocument_clone = wordDocument.clone();
    wordDocument_clone.showDocument();
    //修改文档副本,不会影响原始文档
    wordDocument_clone.setText("这是修改过的Doc2文本");
    wordDocument_clone.showDocument();
    wordDocument.showDocument();
}

结果:

----------WordDocument 构造函数 ---------
Text : 这是一篇文档! Images : [图片一, 图片二, 图片三, 图片四]
Text : 这是一篇文档! Images : [图片一, 图片二, 图片三, 图片四]
Text : 这是修改过的Doc2文本 Images : [图片一, 图片二, 图片三, 图片四]
Text : 这是一篇文档! Images : [图片一, 图片二, 图片三, 图片四]

从上面的输出可以看出,wordDocument_clone是通过wordDocument.clone()创建的,并且wordDocument_clone第一次输出的时候和wordDocument输出是一样的,通过clone对象时并不会执行构造函数!

七、浅拷贝与深拷贝

原型模式的实现是一个浅拷贝,也叫影子拷贝,这份拷贝实际上并不是将原始对象的所有字段都重新构造了一遍,而是副本的字段引用了原始对象的字段,所以原始字段内容发生改变,而副本在还引用着它的情况下也会跟着改变,当然副本修改字段的内容,原始对象也会跟着改变,解决这个问题的方案就是采用深拷贝,即在拷贝对象时,对于引用类型的字段也要采用拷贝的形式,而不是单纯引用的形式。

以上内容就是解答有关“Android编程设计模式之原型模式实例详解”的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/638528.html

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seo的头像K-seoSEO优化员
Previous 2024-11-10 19:53
Next 2024-11-10 20:01

相关推荐

  • 阿里云商标交易平台

    阿里云商标交易平台是阿里巴巴集团旗下的一家专门从事商标交易的平台,致力于为全球用户提供专业、高效、安全的商标交易服务,在这个平台上,用户可以购买、出售、租赁、许可等各类商标,满足不同用户的需求,阿里云商标交易平台的出现,为商标交易市场带来了新的活力,也为商标持有人和需求方提供了更加便捷的交易渠道。阿里云商标交易平台具有丰富的商标资源,……

    2023-12-03
    0167
  • 可视化监控关键词如何帮助企业进行产品定位?

    在当今数据驱动的商业环境中,企业为了保持竞争力,需要对市场进行精确的产品定位,可视化监控关键词作为一种强有力的工具,能够帮助企业洞察市场动态,优化产品策略,并做出更明智的决策,以下是关于如何利用可视化监控关键词帮助企业进行产品定位的详细技术介绍。数据收集与整合企业需要通过各种途径收集相关的数据,这包括但不限于社交媒体、搜索引擎、行业报……

    2024-02-05
    0226
  • azure和aws哪个好

    AWS、Azure和GCE的区别有哪些?云计算平台是现代企业 IT 基础设施的核心组成部分,它们为企业提供了可扩展、灵活且经济高效的计算资源,在众多的云计算平台中,AWS、Azure 和 GCE 是最为知名和广泛使用的三个平台,本文将详细介绍这三者之间的区别,帮助您了解它们的特性和优势,从而选择最适合您业务需求的云计算平台。AWS(A……

    2024-01-11
    0174
  • 使用香港服务器可以解决企业的哪些难题

    使用香港服务器可以解决企业的备案繁琐审核时间长的问题,南北互联不互通的问题,以及选用海外主机的用户国内访问速度慢的问题。

    2024-01-03
    087
  • Redis 如何清空所有数据

    Redis是一个开源的使用ANSI C编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API,它常被用作数据库、缓存和消息中间件,在这篇文章中,我们将详细介绍如何清空Redis中的所有数据。1. 使用FLUSHALL命令Redis提供了一个名为FLUSHALL的命令,可以清空所有……

    2024-03-13
    0174
  • wap建站程序怎么使用

    WAP建站程序是一种基于无线应用协议(Wireless Application Protocol,简称WAP)的网站建设工具,它可以帮助用户快速搭建一个适应移动设备访问的网站,为用户提供便捷的移动互联网服务,本文将详细介绍WAP建站程序的使用方法,帮助大家更好地掌握这一技术。WAP建站程序简介WAP建站程序是一种简化了网站建设过程的工……

    2024-01-22
    0231

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入