原型模式和迭代器模式稚失,使用場景比較特殊鸣皂,原型模式就是用來clone 對象的瞪讼,假設(shè)對象很多屬性要賦值瞻坝,new 一個對象就需要一個個填寫屬性蛛壳,當(dāng)然你也可以ctrl +c
public class Thing implements Cloneable {
private String name=null;
public Thing(String name) {
this.name = name;
}
@Override
protected Thing clone() throws CloneNotSupportedException {
return (Thing) super.clone();
}
@Override
public String toString() {
return "Thing{" +
"name='" + name + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Client {
public static void main(String[] args) {
Thing hello = new Thing("hello");
try {
Thing clone = hello.clone();
System.err.println(clone);
clone.setName("wo");
System.err.println(hello);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
有個主意地方,克隆時候如果是基本類型和String對象,他是直接拷貝衙荐,遇到引用類型他是淺拷貝捞挥,拷貝的只是引用,改了副本改了值還是會關(guān)聯(lián)到原本
public class Thing implements Cloneable {
private String name=null;
private ArrayList<String> stringList=new ArrayList<>();
public Thing(String name) {
this.name = name;
}
@Override
public Thing clone() throws CloneNotSupportedException {
Thing clone1 = (Thing) super.clone();
clone1.stringList = (ArrayList<String>) this.stringList.clone();
return clone1;
}
public void addString(String string){
stringList.add(string);
}
@Override
public String toString() {
return "Thing{" +
"name='" + name + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Client {
public static void main(String[] args) {
Thing hello = new Thing("hello");
hello.addString("AAA");
try {
Thing clone = hello.clone();
System.err.println(clone);
clone.setName("wo");
clone.addString("BBBB");
System.err.println(hello);
//-------------------------------
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
上面例子測試了淺拷貝和深拷貝忧吟,ArrayList 要引用砌函,不能用List,List沒實(shí)現(xiàn)clone 接口