Android应用开发Android 开发设计模式之原型模式解析
白羽 2019-03-15 来源 :网络 阅读 615 评论 0

摘要:本文将带你了解Android应用开发Android 开发设计模式之原型模式解析,希望本文对大家学Android有所帮助。

    本文将带你了解Android应用开发Android 开发设计模式之原型模式解析,希望本文对大家学Android有所帮助。



Android应用开发Android 开发设计模式之原型模式解析



    Android 开发设计模式之原型模式解析。
   
    定义
    用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象
   
    使用场景
    类初始化需要消耗非常多的资源,这个资源包括数据、硬件资源等,通过原型拷贝避免这些消耗   通过new产生一个对象需要非常繁琐的数据准备或访问权限,这时可以使用原型模式   一个对象需要供给其他对象访问,而且各个对象都需要修改其值时,可以拷贝多个对象供调用者访问,即保护性拷贝
    使用例子
    我们常用的Intent,ArrayList等   登录模块中保存的用户信息类需要通过服务器更新用户信息,但是有很多地方需要调用,需要设置为对其他用到的模块只读,这个时候可以考虑用原型模式进行保护性拷贝
    实现
    2大角色
    抽象类或接口,声明具备clone的能力 具体的原型类
    实现的要点
    实现Cloneable接口 覆写Object的clone方法
    实现方式
    下面以文档拷贝的例子来演示一下简单的原型模式
    文档类
  
    public class WordDocument implements Cloneable {
        //文本
        private String text;
     
        //图片
        private ArrayList  images = new ArrayList();
     
        public WordDocument() {
              System.out.println(---WordDocument 构造函数---);
        }
     
        @Override
        protected WordDocument clone()   {
            try {
                WordDocument document =   (WordDocument) super.clone();
                document.text =   this.text;
                document.images =   this.images;
                return document;
     
            }catch (Exception e) {
                  e.printStackTrace();
            }
     
            return null;
        }
     
        public String getText() {
            return text;
        }
     
        public void setText(String text)   {
            this.text = text;
        }
     
        public ArrayList  getImages() {
            return images;
        }
     
        public void addImage(String img)   {
            images.add(img);
        }
     
        /**
         * 打印文档内容
         */
        public void showDocument()   {
            System.out.println(---Word   content start---);
            System.out.println(Text   :  + text);
            System.out.println(images   list : );
            for (String name : images)   {
                System.out.println(image   name :  + name);
            }
            System.out.println(---Word   content end---);
        }
     
    }

    上面模拟创建了一个文档,里面包含文字和图片。拷贝时通过clone方法生成新的文档,并把文字和图片都拷贝到新的文档中 下面是测试代码

    WordDocument doc1 = new WordDocument();
    doc1.setText(这是一篇文档);
    doc1.addImage(图片1);
    doc1.addImage(图片2);
    doc1.addImage(图片3);
    doc1.showDocument();
     
    WordDocument doc2 = doc1.clone();
    doc2.showDocument();
     
    doc2.setText(这是修改过的文档);
    doc2.addImage(图片4);
    doc2.showDocument();
     
    doc1.showDocument();
    下面是测试的输出
   
    ---WordDocument 构造函数---
    ---Word content start---
    Text : 这是一篇文档
    images list :
    image name : 图片1
    image name : 图片2
    image name : 图片3
    ---Word content end---
    ---Word content start---
    Text : 这是一篇文档
    images list :
    image name : 图片1
    image name : 图片2
    image name : 图片3
    ---Word content end---
    ---Word content start---
    Text : 这是修改过的文档
    images list :
    image name : 图片1
    image name : 图片2
    image name : 图片3
    image name : 图片4
    ---Word content end---
    ---Word content start---
    Text : 这是一篇文档
    images list :
    image name : 图片1
    image name : 图片2
    image name : 图片3
    image name : 图片4
    ---Word content end---
    不知道大家看了上面的测试有什么发现? 首先我们成功拷贝了原始的文档。但是当我们修改拷贝后的副文档时,原始的文档也改变,这显然是不行的。
    浅拷贝和深拷贝
      浅拷贝又叫影子拷贝,上面我们在拷贝文档时并没有把原文档中的字段都重新构造了一遍,而只是拷贝了引用,也就是副文档的字段引用原始文档的字段,这样的话修改副文档中的内容就会连原始文档也改掉了,这就是浅拷贝   深拷贝就是在浅拷贝的基础上,对于引用类型的字段也要采用拷贝的形式,比如上面的images,而像String、int这些基本数据类型则没关系   所以在运用原型模式时建议大家还是用深拷贝,下面我们把上面的浅拷贝改成深拷贝

    public class WordDocument implements Cloneable {
        //文本
        private String text;
     
        //图片
        private ArrayList  images = new ArrayList();
     
        public WordDocument() {
              System.out.println(---WordDocument 构造函数---);
        }
     
        @Override
        protected WordDocument clone()   {
            try {
                WordDocument document =   (WordDocument) super.clone();
                document.text =   this.text;
                //document.images =   this.images;
                //改成深拷贝
                document.images =   (ArrayList) this.images.clone();
                return document;
     
            }catch (Exception e) {
                  e.printStackTrace();
            }
     
            return null;
        }
     
        //省略其他代码
     
        /**
         * 打印文档内容
         */
        public void showDocument()   {
            //省略打印
        }
     
    }

    此外还要注意的是,拷贝的时候不会调用构造函数!
    Intent中的原型模式

    @Override
    public Object clone() {
        return new Intent(this);
    }
     
    private Intent(Intent o, boolean all) {
        this.mAction = o.mAction;
        this.mData = o.mData;body{ }    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程