設計模式(三) 原型模式

2021-08-27 18:55:17 字數 2530 閱讀 9193

用原型例項指定建立的種類,並通過複製這些原型建立新的物件。原型模式的本質上就是物件拷貝。·

(1)類初始化需要消耗非常多的資源,這個資源包括資料、硬體資源等,通過原型複製這些消耗。

(2)通過new產生乙個物件需要非常繁瑣的資料準備或訪問許可權,這時可以使用原型模式。

(3)乙個物件需要提供給其他物件訪問,而且各個呼叫者可能都需要修改其值時,可以考慮用原型模式複製多個物件供呼叫者使用,這種方式叫保護性拷貝

具體的原型類worddocument.class

/**

* description: cloneable也是乙個標識介面,表明這個類的物件是可拷貝的

*/public

class

worddocument

implements

cloneable

/*** description: 這個方法並不是cloneable介面中的,而是object中的方法

* 如果沒有實現cloneable介面卻呼叫了clone()函式會報異常

*/@override

protected worddocument clone() catch (clonenotsupportedexception e)

return

null;

}public string gettext()

public

void

settext(string text)

public arraylistgetimages()

public

void

addimages(string img)

public

void

showdocument()

}

client.class

public

class client

}

呼叫new client().test(),在log中檢視日誌,如圖原型模式log1.jpg

由log可以看到,doc2是通過origindoc.clone()建立的,並且doc2第一次輸出的時候和origindoc輸出是一樣的,而doc2修改了文字內容以後並不會影響origindoc的文字內容,保證了origindoc的安全性。

需要注意乙個問題:通過clone拷貝物件時不會執行建構函式,在log中也能看得出來,所以不能在建構函式中執行**。

其實上面的**實際上是乙個淺拷貝,不是將原始文件的所有欄位都重新構造了乙份,而是副本字段引用原始文字字段。那這麼說的話,我們都知道a引用b,那麼a和b這兩個物件指向同乙個位址,a變,b也會跟著變。接下來做乙個小小的變化:

client.class

public class client 

}

呼叫之後再來看下列印的日誌,請看原型模式log2.jpg

哦吼,origindoc中也新增了乙個哈哈.jpg,這是為啥呢?這是因為worddocumentclone()方法只是簡單的進行淺拷貝,引用型別的新物件doc2的images只是單純的指向了this.images引用,並沒有重新構造乙個images物件,這就導致doc2中的images與原始文件中的是同乙個物件,修改其中乙個文件,另乙個文件也會改變,這不是我們想看到的,那麼這時就需要採用深拷貝,即在拷貝物件時,對於引用型的字段也要採用拷貝的形式,修改worddocument中的clone()方法:

@override

protected worddocument clone() catch (clonenotsupportedexception e)

return

null;

}

再來看看效果圖原型模式log3.jpg

原型模式是乙個非常簡單的模式,核心就是對原始物件的拷貝,為了減少錯誤,建議盡量使用深拷貝。

原型模式本質上就是物件拷貝,使用原型模式可以解決構建複雜物件的資源消耗問題,還有個用途是保護性拷貝,也就是某個物件對外可能是唯讀的,為了防止外部對這個物件修改,可以返回乙個物件拷貝實現唯讀的限制。

原型模式是在記憶體中二進位製流的拷貝,要比直接new乙個物件效能好很多,特別是要在乙個迴圈體內產生大量的物件時。

直接記憶體中拷貝,所以建構函式不會執行。

設計模式 三 原型模式

原理 示例 原型模式 prototype pattern 是用於建立重複的物件,同時又能保證效能。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。簡單的說,就是轉殖乙個物件。適用於大物件的建立,因為建立乙個大物件需要很大的開銷,如果每次new就會消耗很大,原型模式僅需記憶體拷貝即可...

設計模式三 原型模式

原型模式 我們從資料庫獲取資料到dto,從dto傳遞給vo,這個時候需要將dto層的資料全部copy到vo中,這種模式就是一種原型模式。copy的方式是轉殖。案例 spring中的 scope prototype 是乙個原型模式,每次建立的時候都是乙個新的物件,這個物件會取到原有物件的所有的值。淺轉...

設計模式(三)原型模式

原型 prototype 模式是一種物件建立型模式,它採取複製原型物件的方法來建立物件的例項。使用prototype模式建立的例項,具有與原型一樣的資料。要實現原型模式,就要讓當前物件實現cloneable介面,並寫乙個返回當前物件的方法。實現介面的意義是告訴虛擬機器我當前這個類可以被轉殖,通過呼叫...