原型模式

来源:互联网 发布:淘宝账号怎么注销掉 编辑:程序博客网 时间:2024/05/20 01:10

1类图

这里写图片描述

2原型模式是一个创建模式。该模式有个样板实例,用户从这个样板对象中复制出一个内部属性一致的对象。用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。

3应用场景

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

4浅拷贝(副本文档的字段引用原始文档的字段)

  • 模型
public class WordDocument implements Cloneable {    private String mText;    private ArrayList<String> mImage = new ArrayList<>();    public WordDocument(){        System.out.println("---构造函数---");    }    @Override    protected WordDocument clone(){        // TODO Auto-generated method stub        try {            WordDocument wd = (WordDocument)super.clone();            wd.mText= this.mText;            wd.mImage = this.mImage;            return wd;        } catch (CloneNotSupportedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return null;    }    public String getmText() {        return mText;    }    public void setmText(String mText) {        this.mText = mText;    }    public ArrayList<String> getmImage() {        return mImage;    }    public void addmImage(String mImage) {        this.mImage.add(mImage);    }    public void showDocument(){        System.out.println("Word content start");        System.out.println("Text: " + mText);        System.out.println("Images List: ");        for (String string : mImage) {            System.out.println("image name : " + string);        }        System.out.println("word content end");        System.out.println();    }}
  • 测试
public class Client {    public static void main(String[] args) {        // TODO Auto-generated method stub        WordDocument wd = new WordDocument();        wd.setmText("这是一篇文章!");        wd.addmImage("图片1");        wd.addmImage("图片2");        wd.addmImage("图片3");        wd.showDocument();        WordDocument wd2 = wd.clone();        wd2.showDocument();        wd2.setmText("修改");        wd2.addmImage("test");        wd2.showDocument();        wd.showDocument();    }}

5深拷贝(建议使用)在protected WordDocument clone()修改如下

protected WordDocument clone(){        // TODO Auto-generated method stub        try {            WordDocument wd = (WordDocument)super.clone();            wd.mText= this.mText;            //wd.mImage = this.mImage;            wd.mImage = (ArrayList<String>) this.mImage.clone();            return wd;        } catch (CloneNotSupportedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return null;    }
原创粉丝点击