2012-07-29 68 views
7

我正在通過Java設計模式,並得到了一些懷疑/問題原型設計模式。 首先讓我說出我的理解。原型設計模式用於創建對象 在內存或資源方面代價很高。所以在這種情況下,我們使用已經可用的那個對象的克隆。 那麼創建新對象和clone()之間有什麼區別?對象在內存中存儲在哪裏?java原型設計模式對象創建

+0

這可能對您有所幫助http://stackoverflow.com/questions/663079/does-cloning-provide-a-performance-improvement-over-constructors-factory-methods – 2012-07-29 05:27:43

回答

3

原型設計模式節省了兩種成本 - 節省時間和節省空間。

節省時間在創建對象時需要對輔助信息進行高成本訪問 - 例如從文件,數據庫或通過網絡請求配置數據。例如,如果要從存儲在Web服務器上的模板中構建大量頁面,則只需讀取一次模板並將其克隆以獲取每個新頁面的起點便宜,而不是分別查詢Web服務器每頁。內存節省來自於重用不可變對象:如果原始文件包含大量字符串,則創建新實例需要創建全新的不可變字符串,或手動處理字符串實習。通過讓克隆共享模板的不可變部分,使用原型模式可以避免這個問題。

4

Java clone()方法只是創建一個新對象並將成員變量值複製到該對象中。一般來說,它不會比創建新對象更便宜。唯一的時候clone()可能比用new創建一個對象便宜的時候,對象的構造函數會花費一些代價:例如,如果構造函數接受參數並將它們用作數據庫查詢的一部分,會怎麼樣?在那種情況下,使用clone()會更便宜,因爲不會發生昂貴的查詢操作。

儘管還有其他原因使用這種設計模式:大多數情況下,當對象在使用之前需要複雜的設置時,無法在構造函數中方便地完成。想象一下,一個對象有20個屬性需要設置。如果你用構造函數參數設置它們,那個構造函數會非常醜陋 - 設想一個具有20個參數的構造函數!相反,您可以構建一個可能不帶參數的對象,使用增變器方法設置20個值,然後在需要時使對象可以製作現成的副本。 clone()完全不需要任何參數,所以它顯然不那麼難看。如果您需要該對象的多個不同版本的多個副本,那麼原型模式變得很有吸引力。