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(){
try {
WordDocument wd = (WordDocument)super.clone();
wd.mText= this.mText;
wd.mImage = this.mImage;
return wd;
} catch (CloneNotSupportedException e) {
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) {
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(){
try {
WordDocument wd = (WordDocument)super.clone();
wd.mText= this.mText;
wd.mImage = (ArrayList<String>) this.mImage.clone();
return wd;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}