Android设计模式——原型模式

原型模式定义

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

原型模式使用的场景

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

原型模式的简单实现

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

public class WordDocument implements Cloneable{
    
    private String mText;
    
    private ArraryList 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 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)this.Images.clone();
    return doc;
    }catch(Exception e){
    }
    return null;
}

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

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

你可能感兴趣的:(Android设计模式——原型模式)