前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >原型模式

原型模式

作者头像
提莫队长
发布2019-02-21 13:38:13
3710
发布2019-02-21 13:38:13
举报
文章被收录于专栏:刘晓杰刘晓杰

1.定义

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

2.示例

代码语言:javascript
复制
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;
    }

}

测试代码:

代码语言:javascript
复制
    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);
    }

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

代码语言:javascript
复制
WordDocument
WordDocument [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]]//****引用传递传的是地址,所以把对应地址保存的数据改了,那么原数据也改了

如果改成深拷贝

代码语言:javascript
复制
WordDocument
WordDocument [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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年03月04日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.定义
  • 2.示例
  • 3.总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档