原型模式其实java Object中已经提供了一个Clone( )方法,平时很少用到,最近读Retrofit源码时候看到有这种使用方式。
深浅拷贝的区别:
浅拷贝是将原始对象中的数据型字段拷贝到新对象中去,将引用型字段的“引用”复制到新对象中去,不把“引用的对象”复制进去,所以原始对象和新对象引用同一对象,新对象中的引用型字段发生变化会导致原始对象中的对应字段也发生变化。
深拷贝是在引用方面不同,深拷贝就是创建一个新的和原始字段的内容相同的字段,是两个一样大的数据段,所以两者的引用是不同的,之后的新对象中的引用型字段发生改变,不会引起原始对象中的字段发生改变
//author: V: jbossjf public class Mail implements Cloneable { ... ... ... // 进行浅拷贝 @Override protected Mail clone() throws CloneNotSupportedException { Mail mail = (Mail) super.clone(); return mail; } }
package ShallowCopy; import java.util.ArrayList; /** * 拷贝 原来 list 进行操作,原来的list中元素同样会增加 1.前拷贝 只拷贝基础数据类型 2.深拷贝,拷贝所有,需要手动进行操作 * * @author V: jbossjf * */ public class Client { public ArrayList<String> getShallowCopyArrayList() { return shallowCopyArrayList; } public void setShallowCopyArrayList(ArrayList<String> shallowCopyArrayList) { this.shallowCopyArrayList = shallowCopyArrayList; } ArrayList<String> shallowCopyArrayList = new ArrayList<String>(); public static void main(String[] args) { ShallowOne shallowOne = new ShallowOne(); ArrayList<String> strings = shallowOne.getShallowCopyArrayList(); strings.add("张三"); //浅拷贝 ArrayList<String> cloneObject = (ArrayList<String>) strings.clone(); cloneObject.add("李四"); System.out.println(cloneObject.toString()); //深拷贝 this.shallowCopyArrayList = (ArrayList<String>) this.shallowCopyArrayList .clone(); } }