原型模式:用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象。
使用场景:
1:类的初始化需要消耗非常多的资源,这个资源包括数据,硬件资源等,通过原型复制避免这些消耗。
2:通过new产生一个对象需要非常繁琐的数据准备或访问权限。
3:一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式复制多个对象供调用者使用,既保护性拷贝。
(只有当以上情况时,拷贝才会体现其性能上的优势)
使用:
让要拷贝的类实现Cloneable接口,并实现clone()方法。
在作为原型的对象处调用其clone方法产生克隆对象。
(通过拷贝创建对象时,不会执行构造函数)
拷贝分为浅拷贝和深拷贝:
浅拷贝副文档中的变量指向原型变量的地址,既改变拷贝对象的变量时,原型变量的值也会发生改变,深拷贝既重新生成一个全新的变量,虽然值一样,但地址不同,这时改变拷贝的值不再影响原型对象的值。(引用数据类型才有影响,基本数据类型不受两种拷贝模式的影响,基本数据类型的数据不会受拷贝对象改变而影响原型的变量的数值)
浅拷贝:
package com.example.mywechat.bean;
import java.util.ArrayList;
/**
* 类描述:
* 创建人:maimanchuang
* 创建时间:2017/12/18 14:33
*/
public class Person
extends BaseBean
implements Cloneable {
private String
number;
private String
passwork;
private ArrayList<String>
nu=
new ArrayList<String>();
public ArrayList<String> getNu() {
return
nu;
}
public void setNu(ArrayList<String> nu) {
this.
nu = nu;
}
public Person(String number, String passwork) {
this.
number = number;
this.
passwork = passwork;
}
public String getNumber() {
return
number;
}
public void setNumber(String number) {
this.
number = number;
}
public String getPasswork() {
return
passwork;
}
public void setPasswork(String passwork) {
this.
passwork = passwork;
}
@Override
protected Object clone()
throws CloneNotSupportedException {
Person person= (Person)
super.clone();
person.
number=
this.
number;
person.
passwork=
this.
passwork;
person.
nu=
this.
nu;
return person;
}
}
Person person=new Person("123","456");
Person personClone=person.clone();
---------------
深拷贝:
@Override
protected Object clone()
throws CloneNotSupportedException {
Person person= (Person)
super.clone();
person.
number=
this.
number;
person.
passwork=
this.
passwork;
person.
nu= (ArrayList<String>)
this.
nu.clone();
return person;
}