原型模式:
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象
使用场景:
1.类的创建消耗很多资源
2new一个对象需要繁琐的数据准备
3一个对象给其他对象使用
运行结果:
就会实际拷贝一份新的出来。
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象
使用场景:
1.类的创建消耗很多资源
2new一个对象需要繁琐的数据准备
3一个对象给其他对象使用
Cloneable 接口
import java.util.ArrayList;
public class TestCloneanle implements Cloneable{
private String mTesxt;
private ArrayList<String> mList = new ArrayList<String>();
public TestCloneanle() {
System.out.println("构造函数");
}
@Override
protected TestCloneanle clone() {
try {
TestCloneanle tc = (TestCloneanle) super.clone();
tc.mTesxt = this.mTesxt;
tc.mList = this.mList;
return tc;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
public String getmTesxt() {
return mTesxt;
}
public void setmTesxt(String mTesxt) {
this.mTesxt = mTesxt;
}
public ArrayList<String> getmList() {
return mList;
}
public void setmList(String s) {
this.mList.add(s);
}
public void show() {
System.out.println("mtext"+mTesxt);
for (int i = 0; i < mList.size(); i++) {
System.out.println("mlist::"+i+":::"+mList.get(i));
}
}
}
public static void main(String[] args) {
TestCloneanle tc = new TestCloneanle();
tc.setmTesxt("nihao");
tc.setmList("one");
tc.setmList("two");
tc.show();
TestCloneanle tc2 = tc.clone();
tc2.setmList("three");
tc2.show();
tc.show();
}
运行结果:
构造函数
mtextnihao
mlist::0:::one
mlist::1:::two
mtextnihao
mlist::0:::one
mlist::1:::two
mlist::2:::three
mtextnihao
mlist::0:::one
mlist::1:::two
mlist::2:::three
clone 是不会执行构造函数的
可以看出修改tc2之后 tc也被修改了,这种拷贝方式称之为浅拷贝。
深拷贝:
@Override
protected TestCloneanle clone() {
try {
TestCloneanle tc = (TestCloneanle) super.clone();
tc.mTesxt = this.mTesxt;
<span style="color:#FF0000;">tc.mList = (ArrayList<String>) this.mList.clone();</span>
return tc;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
结果:
构造函数
mtextnihao
mlist::0:::one
mlist::1:::two
mtextnihao
mlist::0:::one
mlist::1:::two
mlist::2:::three
mtextnihao
mlist::0:::one
mlist::1:::two
就会实际拷贝一份新的出来。