原型模式定义
用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象
原型模式使用的场景
- 类初始化需要消耗很多的资源,这个资源包括数据资源、硬件资源等,通过原型复制可以避免这些消耗。
- 通过new产生一个对象需要非常繁琐的数据准备或访问权限,这时可以使用原型模式。
- 一个对象可能会提供给多个调用者访问,而且各个调用者可能都会修改其值,可以考虑用原型模式复制多个对象供调用者使用,即保护拷贝。
原型模式的简单实现
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本身。
在原型模式中最要注意的就是深拷贝、浅拷贝的问题,在使用时最好使用深拷贝,避免操作副本时影响原始对象的问题。
网友评论