我正在通過Java設計模式,並得到了一些懷疑/問題原型設計模式。 首先讓我說出我的理解。原型設計模式用於創建對象 在內存或資源方面代價很高。所以在這種情況下,我們使用已經可用的那個對象的克隆。 那麼創建新對象和clone()之間有什麼區別?對象在內存中存儲在哪裏?java原型設計模式對象創建
7
A
回答
3
原型設計模式節省了兩種成本 - 節省時間和節省空間。
節省時間在創建對象時需要對輔助信息進行高成本訪問 - 例如從文件,數據庫或通過網絡請求配置數據。例如,如果要從存儲在Web服務器上的模板中構建大量頁面,則只需讀取一次模板並將其克隆以獲取每個新頁面的起點便宜,而不是分別查詢Web服務器每頁。內存節省來自於重用不可變對象:如果原始文件包含大量字符串,則創建新實例需要創建全新的不可變字符串,或手動處理字符串實習。通過讓克隆共享模板的不可變部分,使用原型模式可以避免這個問題。
4
Java clone()
方法只是創建一個新對象並將成員變量值複製到該對象中。一般來說,它不會比創建新對象更便宜。唯一的時候clone()
可能比用new
創建一個對象便宜的時候,對象的構造函數會花費一些代價:例如,如果構造函數接受參數並將它們用作數據庫查詢的一部分,會怎麼樣?在那種情況下,使用clone()
會更便宜,因爲不會發生昂貴的查詢操作。
儘管還有其他原因使用這種設計模式:大多數情況下,當對象在使用之前需要複雜的設置時,無法在構造函數中方便地完成。想象一下,一個對象有20個屬性需要設置。如果你用構造函數參數設置它們,那個構造函數會非常醜陋 - 設想一個具有20個參數的構造函數!相反,您可以構建一個可能不帶參數的對象,使用增變器方法設置20個值,然後在需要時使對象可以製作現成的副本。 clone()
完全不需要任何參數,所以它顯然不那麼難看。如果您需要該對象的多個不同版本的多個副本,那麼原型模式變得很有吸引力。
相關問題
- 1. Java對象創建模式和設計
- 2. Java模型對象設計
- 3. 創建對象的設計模式
- 4. 創建對象的設計模式
- 5. c原型設計模式#
- 6. Swift原型設計模式
- 7. 三ROME對象模型設計模式
- 8. 原型和對象創建
- 9. 對象模型設計
- 10. 用於創建對象的Java模式
- 11. DDD對象創建設計
- 12. 以不同方式從另一個對象創建對象的設計模式
- 13. Linq2XML創建對象模型
- 14. 對象和對象元模式設計
- 15. 反覆創建對象的設計模式
- 16. 用於創建一組數據對象的設計模式
- 17. 從文件創建對象的設計模式?
- 18. Flyweight設計模式來創建共享對象池
- 19. 用於創建子類對象實例的設計模式
- 20. 面向對象設計 - 創建策略/模式
- 21. vtk中的對象創建設計模式
- 22. 查詢對象模式(設計模式)
- 23. 何時使用原型設計模式
- 24. 事件/類設計模式(原型)
- 25. 原型設計模式vs ICloneable
- 26. 在java switch語句中創建新對象。可供選擇的設計模式?
- 27. 動態創建模型對象時在模型中設置值
- 28. javascript原型如何創建對象
- 29. Javascript原型繼承和對象創建
- 30. 瞭解JavaScript對象創建和原型
這可能對您有所幫助http://stackoverflow.com/questions/663079/does-cloning-provide-a-performance-improvement-over-constructors-factory-methods – 2012-07-29 05:27:43