前面幾章咱們介紹了建立型設計模式的部份內容,今天我要說的是建立型設計模式中最後一個——原型模式,原型模式是建立型模式中的一種較爲特殊的模式,有個最大的特色是克隆一個現有的對象,在咱們平常軟件系統開發中,某些對象的建立new即爲複雜,並且咱們須要使用多個相同的實例,這樣若是咱們依舊使用new去進行建立。就會增長系統的複雜度和增長代碼之間的耦合度。可是咱們使用前面介紹的工廠模式的話,隨着產品類型的增多,子類也會隨之增多。維護代碼的難度也就會愈來愈大,因此這裏暫時不適合使用工廠模式。因爲實例都是同樣的,類型相同。可是實例的參數和狀態可能不一樣。這裏有一個對象,而後再結合咱們今天要講述的原型模式。能夠經過一個原型對象,克隆拷貝出許多其餘相同的對象來。html
在面對軟件系統設計的過程當中,會面臨着」複雜對象」的建立,然而對象可能會因爲需求的變更而進行變更。那麼咱們又須要保持接口的穩定性。這時如何保證應對這種變化呢?設計模式
建立型模式通常是用來建立一個新的對象,而後咱們使用這個對象完成一些對象的操做,咱們經過原型模式能夠快速的建立一個對象而不須要提供專門的new()操做就能夠快速完成對象的建立,這無疑是一種很是有效的方式,快速的建立一個新的對象。ide
使用原型實例指定建立對象的種類,而後經過拷貝這些原型來建立新的對象。學習
在原型模式中包含的組成部分較少:優化
抽象原型類:原型類,聲明一須要實現的接口及clone自身的方法this
具體原型類:實現其他接口及clone自身的方法spa
咱們來看這麼一個示例,我記得小時候上課的時候有時候就想着出去玩,就望着窗戶發呆。又出不去。就想本身能夠分身就行了。就能夠一個留在教室學習,一個出去玩耍,學習能夠一次性學習多門功課,玩耍能夠一次玩多個遊戲。這樣就什麼都沒有耽誤,多好呀。固然也只是想一想,實現這個暫時是不可能的了。雖說現實中沒辦法實現了。恰好今天講原型模式,就借用這個示例來說解原型模式究竟是如何使用的吧:設計
namespace Prototype_Pattern { class PrototypePattern { } #region 抽象原型類=========== public abstract class Prototype { /// <summary> /// 當前本身的狀態 /// </summary> public abstract void Status(); /// <summary> /// 當前本身在作的事情 /// </summary> public abstract void Action(string things); /// <summary> /// 拷貝自身的方法 /// </summary> /// <returns></returns> public abstract Prototype Clone(); } #endregion #region 具體原型類——讀書學習 ============= public class LearnPrototype : Prototype { public override void Status() { Console.WriteLine("當前狀態:好好學習"); } public override void Action(string things) { Console.WriteLine(things); } public override Prototype Clone() { return (LearnPrototype)this.MemberwiseClone(); } } #endregion #region 具體原型類——外出玩耍 ============= public class PlayPrototype : Prototype { public override void Status() { Console.WriteLine("當前狀態:開心玩耍"); } public override void Action(string things) { Console.WriteLine( things); } public override Prototype Clone() { return (PlayPrototype)this.MemberwiseClone(); } } #endregion }
class Program { static void Main(string[] args) { //學習 Prototype learnPrototype = new LearnPrototype(); learnPrototype.Status(); learnPrototype.Action("一號在學習:語文"); Prototype learnPrototype1 = learnPrototype.Clone(); learnPrototype.Status(); learnPrototype.Action("二號在學習:數學"); //玩耍 Prototype playPrototype = new PlayPrototype(); playPrototype.Status(); playPrototype.Action("一號在玩耍:遊戲王"); Prototype playPrototype1 = playPrototype.Clone(); learnPrototype.Status(); learnPrototype.Action("二號在玩耍:四驅賽車"); } }
一、在處於資源優化的時候,減小new類的初始化的數量以減小資源消耗code
二、一個對象多個利用修改,將一個對象提供給多個調用者使用。htm
一、原型模式向客戶端隱藏了建立對象的複雜性,提供Clone進行淺拷貝
二、原型類容許動態的增長或減小產品類
三、產品類不須要先肯定產品的等級結構,原型模式適用於任何等級結構
一、每個類都須要配備一個克隆方法
二、配備克隆方法須要對類的功能進行通盤考慮,這對於全新的類不是很難,但對於已有的類不必定很容易,特別當一個類引用不支持串行化的間接對象,或者引用含有循環結構的時候。
到這裏建立型的五個設計模式咱們就暫時的介紹完畢了。 在學習設計模式的時候須要多思考,多斟酌。最好在重構之時考慮加入設計模式。保證設計模式發揮最大的用處。到這裏建立型模式講完了。單例模式關注的是對象實例個數的問題。控制對象僅有一個實例,全局訪問調用。工廠模式和抽象工廠模式解決的是」單個對象」及」一系列對象」的問題。而建造者模式關注解決的是」對象部分」的問題。今天講的原型模式能夠算的上一個特殊的工廠模式。原型模式通常極少單獨使用,通常是配合工廠模式一塊兒使用的。接下來的時間中給你們帶來的是結構型的設計模式解析
平凡人生要用平凡的心去對待,你的人生將會更精彩。
歡迎你們掃描下方二維碼,和我一塊兒踏上設計模式的闖關之路吧!