通過實現cloneable介面,並重寫父類(即object)的clone方法來返回和該物件一模一樣的物件來實現例項化乙個新物件的效果。
比較官方的解釋是:用原型例項指定建立物件的種類,並且通過拷貝這些原型來建立新的物件。
public class prototype implements cloneable
// 省略get/set方法
@override
protected object clone() throws clonenotsupportedexception
}
public class product
}
先例項化乙個物件,然後通過其clone方法複製出乙個新的物件
public static void main(string args) catch (clonenotsupportedexception e)
}
可以看到兩個prototype物件的位址是不一樣的,但是product物件的位址是一樣的。
com.test.product@7adf9f5f
com.test.prototype@85ede7b
com.test.prototype@5674cd4d
com.test.product@7adf9f5f
可以看到複製的prototype物件是乙個新的位址,但是其成員變數product的位址是一樣,他們都引用了同乙個物件,這種複製是淺複製。當其中乙個物件修改product物件的成員變數時,另乙個prototype物件的product也會跟著改變。我們希望在進行複製的時候也將product複製乙份而不是指向同乙個引用,這樣的複製是深複製。
public class product implements cloneable
@override
protected object clone() throws clonenotsupportedexception
}
public class prototype implements cloneable
// 省略get/set方法
@override
protected prototype clone() throws clonenotsupportedexception
}
com.test.product@7adf9f5f
com.test.prototype@85ede7b
com.test.prototype@5674cd4d
com.test.product@63961c42
可以看到兩個product物件的位址是不一樣的了。
原型模式實現的關鍵就是要實現clone方法,object類是所有類預設的父類,其自帶clone方法,而且這個方法是protect性質的,也就是說每乙個類都能重寫clone方法,但是要想這個類具備複製的能力就一定實現cloneable介面,不然就是丟擲clonenotsupportedexception異常。
還有一點就是 string型別的變數不會存在深淺複製這樣的問題。
第一點好處就是:不用重複的初始化物件,而是動態地獲得物件執行時的狀態。
第二點好處就是:在初始化資訊不好生變化或者變化不是很大的情況下,這種方式隱藏了物件建立的細節,又對效能是大大提公升(clone方式是乙個native方法,它直接操作記憶體中的二進位製流,特別是複製大物件時,效能的差別非常明顯。)
Java設計模式4 原型模式
原型模式是一種建立型設計模式,它通過複製乙個已經存在的例項來返回新的例項,而不是新建例項.被複製的例項就是我們所稱的原型,這個原型是可定製的.說白了就是乙個類實現了cloneable,重寫clone方法,就可以呼叫這個類的物件複製例項了。1 拷貝分類 原型模式中的拷貝分為 淺拷貝 和 深拷貝 淺拷貝...
Python設計模式4 原型模式
原型模式,也是用於建立物件時的一種設計方法。主要應用場景是 每次初始化某個物件時,需要傳遞大量的引數,很不方便,此時,可以使用原型模式,在已經建立並初始化的物件基礎上,可以快速而又方便建立新的不同物件。主要原理 使用深拷貝,複製乙個已建立的物件,然後使用 dict update 方法更新已建立物件中...
設計模式 原型模式
1.首先分析原型模式的由來 一般來說,建立乙個物件可以由以下方法 知道物件的具體型別,直接用new生成。不知道型號,知道相應的需求,可以使用工廠方法模式。根據乙個已有的物件來複製為乙個新的物件,可以使用原型模式。2.原型模式可以簡單理解為拷貝原型物件得到新的物件。想象乙個配鑰匙的小店,給店主乙個原有...