Android设计模式——原型模式

原型模式定义

用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象

原型模式使用的场景

  • 类初始化需要消耗很多的资源,这个资源包括数据资源、硬件资源等,通过原型复制可以避免这些消耗。
  • 通过new产生一个对象需要非常繁琐的数据准备或访问权限,这时可以使用原型模式。
  • 一个对象可能会提供给多个调用者访问,而且各个调用者可能都会修改其值,可以考虑用原型模式复制多个对象供调用者使用,即保护拷贝。

原型模式的简单实现

1.实现拷贝的类需实现cloneable接口,实现clone()方法

public class WordDocument implements Cloneable{
    
    private String mText;
    
    private ArraryList<String> mImages = new ArraryList<>();
    
    public WordDocument(){}
    
    @Override
    protected WordDocument clone(){
        try{
            WordDocument doc = (WordDocument)super.clone();
            doc.mText = this.mText;
            doc.mImages = this.mImages;
            return doc;
        }catch(Exception e){
        }
        return null;
    }
    
    public void setText(String mText){
        this.mText = mText;
    }
    
    public String getText(){
        return mText;
    }
    
    public void addImage(String msg){
        this.mImages.add(msg);
    }
    
    public List<Stirng> getImages(){
        return mImages;
    }
    
    public void showDocument(){
        for(String imgName : mImages){
            System.out.println(imgName);
        }
    }
}

2.浅拷贝和深拷贝

先看一个例子

WordDocumet old = new WordDocument();
old.setText("123456");
old.addImage("abc");
old.addImage("def");
old.showDocument();

WordDocument new = old.clone();
new.showDocument();
new.setText("lalala");
new.showDocument();
old.showDocument();

运行结果如下:

123456
abc
def

123456
abc
def

lalala
abc
def

123456
abc
def

可以看到new是通过old拷贝的,修改了new的mText值时,old的mText值,并没有受到影响。

WordDocumet old = new WordDocument();
old.setText("123456");
old.addImage("abc");
old.addImage("def");
old.showDocument();

WordDocument new = old.clone();
new.showDocument();
new.setText("lalala");
new.addImage("ghi");
new.showDocument();
old.showDocument();

结果如下:

123456
abc
def

123456
abc
def

lalala
abc
def
ghi

123456
abc
def
ghi

可以看到,向ArraryList中加值后,old和new的mImage都改变了。

因为WordDocument的clone方法只是简单地进行浅拷贝,也就是引用类型的新对象new的mImages只是单纯的指向了this.mImages引用,并没有重新构造一个新的对象就,这就叫浅拷贝

在拷贝对象时,对引用型的字段采用拷贝的形式,叫做深拷贝

protect WordDocument clone(){
    try{
    WordDocument doc = (WordDocument)super.clone();
    doc.mText = this.mText;
    doc.mImages = (ArraryList<String>)this.Images.clone();
    return doc;
    }catch(Exception e){
    }
    return null;
}

上述代码,将doc.mImages指向this.mImages的一份拷贝,而不是this.mImages本身。

在原型模式中最要注意的就是深拷贝、浅拷贝的问题,在使用时最好使用深拷贝,避免操作副本时影响原始对象的问题。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、定义 用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象。 原型模式本质上就是对象拷贝。使用原型模式...
    Utte阅读 531评论 0 0
  • 1大同小异的工作周报 Sunny软件公司一直使用自行开发的一套OA (Office Automatic,办公自动化...
    justCode_阅读 1,232评论 0 3
  • 个性电子账单 现在电子账单越来越流行了,比如你的信用卡,没到月初的时候银行就会发一份电子邮件给你,说你这个月消费了...
    stayiwithime阅读 535评论 0 0
  • 对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次。而在a...
    WANKUN阅读 320评论 0 2
  • 学习《Android 源码设计模式解析与实践》系列笔记 介绍 原型模式是一种创建型的模式。原型模式就是用户从一个样...
    安静的蓝孩子阅读 694评论 0 1

友情链接更多精彩内容