原型模式

一:原型模式定義(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
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章