大話設計模式 原型模式

2021-09-07 17:57:33 字數 2466 閱讀 1470

學無止境,精益求精

十年河東,十年河西,莫欺少年窮

學歷代表你的過去,能力代表你的現在,學習代表你的將來

上篇部落格介紹了c# 深淺複製,其實原型模式講的主要就是物件的深淺複製 參考: c# 深淺複製 memberwiseclone

ok,言歸正傳

原型模式的概念:

用原型例項指定建立物件的種類,並且通過拷貝這些原型物件來建立新的物件!

原型模式其實就是從乙個物件再建立另外乙個可定製的物件,而且不需要知道任何建立的細節

首先簡單介紹下原型模式的應用場景,如下:

一般在初始化的資訊不發生變動的情況下,不用重新初始化物件,而是動態的獲得物件執行時的狀態,轉殖是最好的方法。這既隱藏了物件建立的細節,又對效能是大大的提高。

上述的解釋似乎難以弄明白,現在我們來解釋下:

我們知道,物件是通過建構函式來建立的,如果在建構函式中存在著大量的業務邏輯,那麼這個物件的建立就會消耗不少的資源,這也意味著物件的建立過程會消耗掉一定的時間。如果我們需要乙個『類似』的物件,可以採用轉殖的方式來建立這個物件,這樣就可以不執行建構函式來建立乙個新的物件,這個物件的建立將會大大提公升效能!

因此,使用原型模式有以下條件:

1、初始化資訊不發生變動時,可考慮使用原型模式來轉殖物件

2、當通過建構函式建立乙個新的例項會消耗過多資源時,可考慮使用原型模式來轉殖物件

3、當需要動態獲取物件執行時狀態時,可考慮使用原型模式來轉殖物件

總之:原型模式的基本理念就是在符合一定的場景下,通過轉殖物件來動態獲取物件的執行時狀態並大大提公升物件建立的效率!

何為轉殖物件呢?

.net 在system 命名空間中提供了icloneable 介面,其中就是唯一的乙個方法clone(),實現這個介面就可以完成原型模式了。

ok,上述從概念性的東西介紹原型模式,那麼,我們現在進入實戰:

1、原型模式的uml類圖

2、原型模式在生活中的體現:

現實生活中,也有很多原型設計模式的例子,例如,細胞**的過程,乙個細胞的有絲**產生兩個相同的細胞;還有西遊記中孫悟空變出後孫的本領和火影忍者中鳴人的隱分身忍術等。下面就以孫悟空為例子來演示下原型模式的實現。

具體的實現**如下:

///

孫悟空的的變化就是原型模式

class

client

}//////

孫悟空原型

/// public

abstract

class

monkeykingprototype

public monkeykingprototype(string

id)

//轉殖方法,即孫大聖說「變」

public

abstract

monkeykingprototype clone();

}//////

建立具體原型

/// public

class

concreteprototype : monkeykingprototype

//////

淺拷貝

/// ///

public

override

monkeykingprototype clone()

}

上述**通過『淺複製』來建立孫悟空的副本!並沒有涉及到深複製

關於深/淺複製,在我的上篇部落格中已經非常詳細的介紹了,在此不再列舉其他案例!

原型模式的優點有:

原型模式向客戶隱藏了建立新例項的複雜性

原型模式允許動態增加或較少產品類。

原型模式簡化了例項的建立結構,工廠方法模式需要有乙個與產品類等級結構相同的等級結構,而原型模式不需要這樣。

產品類不需要事先確定產品的等級結構,因為原型模式適用於任何的等級結構

原型模式的缺點有:

配備轉殖方法需要對類的功能進行通盤考慮,這對於全新的類不是很難,但對於已有的類不一定很容易,特別當乙個類引用不支援序列化的間接物件,或者引用含有迴圈結構的時候。

最後,列舉下c#中用到的深淺複製,比如:c#中的資料集物件dataset,它就有clone()方法和copy()方法,其中clone()是用來複製dataset的結構,相當於淺複製。copy()方法不僅複製dataset的結構,也會複製dataset的資料,因此,copy()方法類似於深複製!

@陳臥龍的部落格

《大話設計模式》 原型模式

如果物件的建立成本比較大,而同乙個類的不同物件之間差別不大 大部分欄位都相同 在這種情況下,我們可以利用對已有物件 原型 進行複製 或者叫拷貝 轉殖 的方式,來建立新物件,以達到節省建立時間的目的。這種基於原型來建立物件的方式就叫作原型設計模式,簡稱原型模式。核心 拷貝 轉殖 建立物件包含的申請記憶...

《大話設計模式 原型模式》筆記

1 原型模式 prototype 用原型例項指定建立物件的種類,並通過拷貝這些原型建立新的物件。2 原型模式結構圖 3 簡單 實現 3.1 繼承cloneable介面 public class concrereprototype implements cloneable public string ...

大話設計模式 原型模式 9

using system using system.collections.generic using system.linq using system.text namespace prototypefactory public prototype string id public abstrac...