java 原型模式
轉http://luchar.iteye.com/blog/179624
一、原型模式定義
用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象.
Prototype模式允許一個對象再創建另外一個可定製的對象,根本無需知道任何如何創建的細節。
工作原理是:通過將一個原型對象傳給那個要發動創建的對象,這個要發動創建的對象通過請求原型對象拷貝它們自己來實施創建。
二、如何使用
因爲Java中的提供clone()方法來實現對象的克隆,所以Prototype模式實現一下子變得很簡單.
三、實例
Java代碼- public abstract class AbstractSpoon implements Cloneable{
- String spoonName;
- public void setSpoonName(String spoonName) {
- this.spoonName = spoonName;
- }
- public String getSpoonName() {return this.spoonName;}
- public Object clone(){
- Object object = null;
- try {
- object = super.clone();
- } catch (CloneNotSupportedException exception) {
- System.err.println("AbstractSpoon is not Cloneable");
- }
- return object;
- }
- }
有個具體實現(ConcretePrototype):
Java代碼- public class SoupSpoon extends AbstractSpoon{
- public SoupSpoon(){
- setSpoonName("Soup Spoon");
- }
- }
調用Prototype模式很簡單:
AbstractSpoon spoon = new SoupSpoon();
AbstractSpoon spoon2 = spoon.clone();
當然也可以結合工廠模式來創建AbstractSpoon實例。
在Java中Prototype模式變成clone()方法的使用,此方法執行的是該對象的“淺表複製”,而不“深層複製”操作。
四、說明:
克隆必須滿足的條件:
a.對任何的對象x,都有:x.clone() != x,即克隆對象與原對象不是同一個對象。
b.對任何的對象x,都有:x.clone().getClass() == x.get getClass(),即克隆對象與原對象的類型是一樣的。 c.如果對象x的equals()方法定義恰當的話,那麼x.clone().equals(x)應當是成立的。
在java中實現clone()應該滿足這三個條件。
淺複製:複製了值類型對象,對於引用類型對象,只複製了引用,它指向原來引用的對象。Java中clone爲淺複製。
深複製:對值類型和引用類型的對象都生成一份新的拷貝. Java中可以通過串行化來進行深複製,前提是對象以及對象內部所引用的對象都是可串行化的,否則需要考慮將那些不可串行化的對象可否設爲transient,排除在複製過程之外。
(
淺克隆:被克隆對象的所有變量都含有與原來的對象相同的值,而它所有的對其他對象的引用都仍然指向原來的對象。換一種說法就是淺克隆僅僅克隆所考慮的對象,而不克隆它所引用的對象。
深克隆:被克隆對象的所有變量都含有與原來的對象相同的值,但它所有的對其他對象的引用不再是原有的,而這是指向被複制過的新對象。換言之,深複製把要複製的對象的所有引用的對象都複製了一遍,這種叫做間接複製。
)