Spring中常用的設計模式:原型模式
文章目錄
定義
原型模式:使用原型例項指定待建立物件的型別,並且通過複製這個原型來建立新的物件。
模式分析
在原型模式結構中定義了一個抽象原型類,所有的Java類都繼承自java.lang.Object,而Object類提供一個clone()方法,可以將一個Java物件複製一份。因此在Java中可以直接使用Object提供的clone()方法來實現物件的克隆,Java語言中的原型模式實現很簡單。
能夠實現克隆的Java類必須實現一個標識介面Cloneable,表示這個Java類支援複製。如果一個類沒有實現這個介面但是呼叫了clone()方法,Java編譯器將丟擲一個CloneNotSupportedException異常。
注意: java.lang.Cloneable
只是起到告訴程式可以呼叫clone方法的作用,它本身並沒有定義任何方法。
在使用原型模式克隆物件時,根據其成員物件是否也克隆,原型模式可以分為兩種形式: 深拷貝
和 淺拷貝
。
深拷貝:當一個類的拷貝構造方法,不僅要複製物件的所有非引用成員變數值,還要為引用型別的成員變數建立新的例項,並且初始化為形式引數例項值。這個方式稱為深拷貝。
也就是說淺拷貝只複製一個物件,傳遞引用,不能複製例項。而深拷貝對物件內部的引用均複製,它是建立一個新的例項,並且複製例項。
對於淺拷貝當物件的成員變數是基本資料型別時,兩個物件的成員變數已有儲存空間,賦值運算傳遞值,所以淺拷貝能夠複製例項。但是當物件的成員變數是引用資料型別時,就不能實現物件的複製了。
模式優缺點分析
原型模式的優點:
- 當建立新的物件例項較為複雜時,使用原型模式可以簡化物件的 建立過程,通過一個已有例項可以提高新例項的建立效率。
- 可以動態增加或減少產品類。
- 原型模式提供了簡化的建立結構。
- 可以使用深克隆的方式儲存物件的狀態。
原型模式的缺點:
- 需要為每一個類配備一個克隆方法,而且這個克隆方法需要對類的功能進行通盤考慮,這對全新的類來說不是很難,但對已有的類進行改造時,不一定是件容易的事,必須修改其原始碼,違背了“開閉原則”。
- 在實現深克隆時需要編寫較為複雜的程式碼。
原型模式的實際應用案例
(1) 原型模式應用於很多軟體中,如果每次建立一個物件要花大量時間,原型模式是最好的解決方案。很多軟體提供的複製(Ctrl + C)和貼上(Ctrl + V)操作就是原型模式的應用,複製得到的物件與原型物件是兩個型別相同但記憶體地址不同的物件,通過原型模式可以大大提高物件的建立效率。
(2) 在Struts2中為了保證執行緒的安全性,Action物件的建立使用了原型模式,訪問一個已經存在的Action物件時將通過克隆的方式創建出一個新的物件,從而保證其中定義的變數無須進行加鎖實現同步,每一個Action中都有自己的成員變數,避免Struts1因使用單例模式而導致的併發和同步問題。
(3) 在Spring中,使用者也可以採用原型模式來建立新的bean例項,從而實現每次獲取的是通過克隆生成的新例項,對其進行修改時對原有例項物件不造成任何影響。
在每次使用物件之前,都會建立一個新的物件,並且會將依賴關係完整的賦值給這個新建立的物件。這樣有利於節省系統資源,還可以更好的對原型管理器物件進行控制。