設計模式(八)原型模式

使用場景:當通過new產生的一個對象需要非常繁瑣的數據準備或訪問權限時,可以使用原型模式。

類似於java中的克隆技術,以某個對象爲原型,複製出新的對象。新對象與原型對象擁有相同特點。

優勢:效率高,避免了重新執行構造過程的步驟。


與new出來的對象的比較:

new創建新的對象屬性採用的是默認值。克隆出的對象的屬性值完全和原型對象相同。

克隆出的新對象改變不會影響原型對象,並且修改克隆對象的值不影響原型對象。


淺複製:修改原型和克隆修改任意一個對象的屬性,都影響對方,因爲2個內存地址值指向同一對象

public class LightPrototype implements Cloneable{
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "LightPrototype [name=" + name + "]";
	}

	public LightPrototype(String name) {
		super();
		this.name = name;
	}

	public LightPrototype() {
		super();
	}
	
	@Override
	protected Object clone() throws CloneNotSupportedException {
		Object o = super.clone();
		return o;
	}
}


深複製:修改原型和克隆修改任意一個對象的屬性,不影響其他對象的屬性值

public class DeepPrototype implements Cloneable{
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "DeepPrototype [name=" + name + "]";
	}

	public DeepPrototype(String name) {
		super();
		this.name = name;
	}

	public DeepPrototype() {
		super();
	}
	
	@Override
	protected Object clone() throws CloneNotSupportedException {
		Object o = super.clone();
		DeepPrototype d = (DeepPrototype)o;
		d.name = (String) this.name.clone();
		return o;
	}
}


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