Android设计模式——原型模式

2019-10-04  本文已影响0人  李die喋

原型模式定义

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

原型模式使用的场景

原型模式的简单实现

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本身。

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

上一篇 下一篇

猜你喜欢

热点阅读