一:原型模式定義(bean的prototype):
用原型實例指定創建對象的實例,並且通過拷貝這些原型創建新的對象
二:原型模式特點:
運用到的主要是克隆。原理是從內存中以二進制流的方式進行拷貝,重新分配一個內存塊,構造函數不會被執行,且類成員變量上不可以被final修飾,否則報錯。對於基本類型(包括String)克隆後的對象修改不會影響到克隆前對象,而對於數組或者引用類型,克隆後對象的修改會影響到克隆前的對象。因爲object的clone默認是淺克隆,即此時數組或者引用對象在內存中執行的依舊是同一個地址。
第一是要實現clonable接口,該接口雖然無任何方法,但是卻用來標識該對象是可以被拷貝的,若不實現該接口報錯。
第二是重寫clone方法,完成對象從可以被拷貝到實現拷貝的功能。同時在重寫該方法的時候要將訪問權限定義爲public,以便其他類可以調用。
第三是重寫的clone方法裏調用super.clone()。因爲object的clone是native的,速度快。
三:原型模式實現:
原型類和測試類綜合一起:
public class Teacher implements Cloneable {
private String name;//基本類型
private Person person;//引用類型
@Override
public Teacher clone() throws Exception {
Teacher teacher = null;
try {
teacher = (Teacher) super.clone();
//下面這句話完成深克隆的功能
teacher.setPerson(this.person.clone());
} catch (Exception e) {
System.out.println("不支持克隆");
}
return teacher;
}
public static void main(String[] args) throws Exception {
Person s1 = new Person();
s1.setName("張三");
Teacher teacher1 = new Teacher();
teacher1.setName("小趙老師");
teacher1.setPerson(s1);
Teacher teacher2 = teacher1.clone();
teacher2.setName("張三三");//基本類型的改變不會影響
Person s2 = teacher2.getPerson();
s2.setName("李四");//引用類型的改變會影響teacher1.即克隆後對person的引用指向同一個地址
System.out.println(teacher1.getName() == teacher2.getName());//無論深淺都爲false
System.out.println(teacher1.getPerson() == teacher2.getPerson());//淺克隆爲true,深克隆爲false
}
}