原型模式

来源:互联网 发布:淘宝魔镜插件下载 编辑:程序博客网 时间:2024/06/14 23:04

1.定义

用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。被复制的实例就是“原型”,这个原型是可定制的。

2.示例

public class WordDocument implements Cloneable {    private String mText;    private ArrayList<String> mImages = new ArrayList<String>();    public WordDocument() {        super();        System.out.println("WordDocument");    }    public String getText() {        return mText;    }    public void setText(String mText) {        this.mText = mText;    }    public ArrayList<String> getmImages() {        return mImages;    }    public void setImages(ArrayList<String> mImages) {        this.mImages = mImages;    }    public void addImg(String img){        this.mImages.add(img);    }    @Override    public String toString() {        return "WordDocument [mText=" + mText + ", mImages=" + mImages + "]";    }    @Override    protected WordDocument clone() throws CloneNotSupportedException {        try {            WordDocument document = (WordDocument) super.clone();            //document.mImages = (ArrayList<String>) this.mImages.clone();            //没有这句话表示浅拷贝,也就是C++的引用传递            return document;        } catch (Exception e) {            e.printStackTrace();        }        return null;    }}

测试代码:

    public static void main(String[] args) throws CloneNotSupportedException {        WordDocument doc = new WordDocument();        doc.setText("origin");        doc.addImg("img ori");        System.out.println(doc);        System.out.println("--------------------clone-------------------------");        WordDocument doc2 = doc.clone();        System.out.println(doc2);        doc2.setText("modify");        doc2.addImg("img  2");        System.out.println(doc2);        System.out.println(doc);    }

实例中如果有注释,也就是浅拷贝,那么打印情况如下

WordDocumentWordDocument [mText=origin, mImages=[img ori]]--------------------clone-------------------------WordDocument [mText=origin, mImages=[img ori]]WordDocument [mText=modify, mImages=[img ori, img  2]]WordDocument [mText=origin, mImages=[img ori, img  2]]//****引用传递传的是地址,所以把对应地址保存的数据改了,那么原数据也改了

如果改成深拷贝

WordDocumentWordDocument [mText=origin, mImages=[img ori]]--------------------clone-------------------------WordDocument [mText=origin, mImages=[img ori]]WordDocument [mText=modify, mImages=[img ori, img  2]]WordDocument [mText=origin, mImages=[img ori]]//原数据没变

3.总结

优点
(1)原型模式是在内存中二进制流的拷贝,要比直接new一个对象性能好很多,特别是要在一个循环体内产生大量对象时,原型模式可能更好的体现其优点。
(2)还有一个重要的用途就是保护性拷贝,也就是对某个对象对外可能是只读的,为了防止外部对这个只读对象的修改,通常可以通过返回一个对象拷贝的形式实现只读的限制。
缺点:
(1)这既是它的优点也是缺点,直接在内存中拷贝,构造函数是不会执行的,在实际开发中应该注意这个潜在问题。优点是减少了约束,缺点也是减少了约束,需要大家在实际应用时考虑。
(2)通过实现Cloneable接口的原型模式在调用clone函数构造实例时并不一定比通过new操作速度快,只有当通过new构造对象较为耗时或者说成本较高时,通过clone方法才能够获得效率上的提升。

参考:http://blog.csdn.net/qq_17766199/article/details/50265009

0 0