1:使用场景
1)类初始化需要消耗非常多的资源,包括数据或硬件资源,通过原型拷贝可以避免
2)通过new产生一个对象需要非常繁琐的数据准备过程或权限控制,这时可以使用原型模式
3)一个对象需要提供给其他对象访问,而且各个调用者可能都需要改变其值时,可以考虑使用原型模式拷贝多个对象供调用者使用,即保护性拷贝
2:UML图
3:代码举例:
public class WordDocument implements Cloneable{
private String mText;
private ArrayList<String> mImages=new ArrayList<String>();
public WordDocument(){
System.out.println("===WordDocument()");
}
@Override
protected WordDocument clone() {
try{
WordDocument document=(WordDocument)super.clone();
document.mText=this.mText;
document.mImages=this.mImages;
return document;
}catch(Exception e){
}
return null;
}
public void setText(String text) {
this.mText=text;
}
public String getText() {
return mText;
}
public void addImage(String img) {
this.mImages.add(img);
}
public ArrayList<String> getImages() {
return mImages;
}
public void showDocument(){
System.out.println("===文档开始");
System.out.println("===mText: "+mText);
System.out.println("===Image List: ");
for(String img:mImages){
System.out.println("===Image Name "+img);
}
System.out.println("===文档结束");
}
}
public class Client {
public static void main(String[] args){
WordDocument orignDocument=new WordDocument();
orignDocument.setText("第一篇文章");
orignDocument.addImage("图片1");
orignDocument.addImage("图片2");
orignDocument.addImage("图片3");
orignDocument.showDocument();
WordDocument doc2=orignDocument.clone();
doc2.showDocument();
doc2.setText("这是修改后的doc文本");
doc2.showDocument();
orignDocument.showDocument();
}
}
浅拷贝与深拷贝
1:浅拷贝
public static void main(String[] args){
WordDocument orignDocument=new WordDocument();
orignDocument.setText("第一篇文章");
orignDocument.addImage("图片1");
orignDocument.addImage("图片2");
orignDocument.addImage("图片3");
orignDocument.showDocument();
WordDocument doc2=orignDocument.clone();
doc2.showDocument();
doc2.setText("这是修改后的doc文本");
doc2.addImage("哈哈");
doc2.showDocument();
orignDocument.showDocument();
}
@Override
protected WordDocument clone() {
try{
WordDocument document=(WordDocument)super.clone();
document.mText=this.mText;
document.mImages=(ArrayList<String>)this.mImages.clone();
return document;
}catch(Exception e){
}
return null;
}
4:android中原型模式
public class Intent implements Parcelable, Cloneable
@Override
public Object clone() {
return new Intent(this);
}