原型模式(prototype pattern)是用於建立重複的物件,同時又能保證效能。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。
在原型模式中我們可以利用過乙個原型物件來指明我們所要建立物件的型別,然後通過複製這個物件的方法來獲得與該物件一模一樣的物件例項。這就是原型模式的設計目的。
這種模式是實現了乙個原型介面,該介面用於建立當前物件的轉殖。當直接建立物件的代價比較大時,則採用這種模式。例如,乙個物件需要在乙個高代價的資料庫操作之後被建立。我們可以快取該物件,在下乙個請求時返回它的轉殖,在需要的時候更新資料庫,以此來減少資料庫呼叫。
優點:1、效能提高。 2、逃避建構函式的約束。
缺點:1、配備轉殖方法需要對類的功能進行通盤考慮,這對於全新的類不是很難,但對於已有的類不一定很容易,特別當乙個類引用不支援序列化的間接物件,或者引用含有迴圈結構的時候。 2、必須實現 cloneable 介面。
淺複製與深複製概念
1.淺複製(淺轉殖)
被複製物件的所有變數都含有與原來的物件相同的值,而所有的對其他物件的引用仍然指向原來的物件。換言之,淺複製僅僅複製所考慮的物件,而不複製它所引用的物件。
2.深複製(深轉殖)
被複製物件的所有變數都含有與原來的物件相同的值,除去那些引用其他物件的變數。那些引用其他物件的變數將指向被複製過的新物件,而不再是原有的那些被引用的物件。換言之,深複製把要複製的物件所引用的物件都複製了一遍。
當建立乙個物件需要消耗大量資源的時候(不是說這個物件占用很多資源,而是建立這個物件的過程需要消耗大量資源),我們就可以使用原型模式:即從現有的乙個物件轉殖出乙個物件,從而避免了消耗大量資源的建立過程。
關於轉殖,這裡不詳細介紹。有興趣的可以自己去找部落格看一下,有三種方法,這裡我只寫一種。
沒有別的原因,只是因為碼字太累了,哎,吐槽下,上完班回來,晚上還要學習一下,賊累。
就拿之前建造者模式的 「女朋友」 來說。
package practices.mode.prototype_pattern;
// 1. 首先需要建立乙個「女朋友」類
// 定義其屬性:比如姓名、年齡、身體、智商等等
// 原型模式需要實現 cloneable介面,這個介面是乙個空介面,裡面沒有任何需要實現的方法,該介面表示該類能夠複製且具體複製的能力
// clone方法是在object種定義的,而且是protected型的,只有實現了這個介面,才可以在該類的例項上呼叫clone方法,
// 否則會丟擲clonenotsupportexception。
// 然後重寫clone() 方法
public
class
girlfriend
implements
cloneable
public
void
setbody
(string body)
public string getname()
public
void
setname
(string name)
public string getage()
public
void
setage
(string age)
public string getiq()
public
void
setiq
(string iq)
@override
public string tostring()
';}// 這裡是淺轉殖,書寫方式基本一致,
// 深轉殖也差不多,在這個基礎上將屬性為應用物件的屬性進行一次轉殖,這些為引用物件的屬性也需要實現淺轉殖
public object clone()
catch
(clonenotsupportedexception e)
return new_girl;
}}
Java設計模式 原型模式
原型模式是乙個建立型的模式。該模式有乙個樣板例項,使用者從這個樣板物件中複製出乙個內部屬性一致的物件,這個過程也就是俗稱的 轉殖 被複製的例項就是所稱的 原型 原型模式 用原型例項指定建立物件的種類,並通過拷貝這些原型建立新的物件 通過實現cloneable介面 public class wordd...
學習設計模式 原型模式
說明 通過原型模式可以自動複製乙個例項化物件a給新的物件例項化物件b,這樣可以省去很多例項化 重複 的工作,便於維護。轉殖分為淺轉殖和深轉殖,淺轉殖只轉殖基礎型別資訊,對於類似物件這樣的複雜型別資訊,只轉殖這個物件的引用 深轉殖是基礎型別和複雜型別都轉殖其值,而不僅僅是轉殖引用 需求 複製簡歷,需要...
java設計模式 原型模式(Prototype)
prototype原型模式是一種建立型設計模式,prototype模式允許乙個物件再建立另外乙個可定製的物件,根本無需知道任何如何建立的細節,工作原理是 通過將乙個原型物件傳給那個要發動建立的物件,這個要發動建立的物件通過請求原型物件拷貝它們自己來實施建立 原型模式實際上非常簡單,只是要實現clon...