前言
前面幾章我們介紹了創(chuàng)建型設(shè)計(jì)模式的部分內(nèi)容,今天我要說的是創(chuàng)建型設(shè)計(jì)模式中最后一個(gè)——原型模式,原型模式是創(chuàng)建型模式中的一種較為特殊的模式,有個(gè)最大的特點(diǎn)是克隆一個(gè)現(xiàn)有的對(duì)象,在我們?nèi)粘\浖到y(tǒng)開發(fā)中,某些對(duì)象的創(chuàng)建new即為復(fù)雜,而且我們需要使用多個(gè)相同的實(shí)例,這樣如果我們依舊使用new去進(jìn)行創(chuàng)建。就會(huì)增加系統(tǒng)的復(fù)雜度和增加代碼之間的耦合度。但是我們使用前面介紹的工廠模式的話,隨著產(chǎn)品類型的增多,子類也會(huì)隨之增多。維護(hù)代碼的難度也就會(huì)越來越大,所以這里暫時(shí)不適合使用工廠模式。由于實(shí)例都是一樣的,類型相同。但是實(shí)例的參數(shù)和狀態(tài)可能不同。這里有一個(gè)對(duì)象,然后再結(jié)合我們今天要講述的原型模式??梢酝ㄟ^一個(gè)原型對(duì)象,克隆拷貝出許多其他相同的對(duì)象來。
原型模式介紹
一、來由
在面對(duì)軟件系統(tǒng)設(shè)計(jì)的過程中,會(huì)面臨著”復(fù)雜對(duì)象”的創(chuàng)建,然而對(duì)象可能會(huì)由于需求的變動(dòng)而進(jìn)行變動(dòng)。那么我們又需要保持接口的穩(wěn)定性。這時(shí)如何保證應(yīng)對(duì)這種變化呢?
創(chuàng)建型模式一般是用來創(chuàng)建一個(gè)新的對(duì)象,然后我們使用這個(gè)對(duì)象完成一些對(duì)象的操作,我們通過原型模式可以快速的創(chuàng)建一個(gè)對(duì)象而不需要提供專門的new()操作就可以快速完成對(duì)象的創(chuàng)建,這無疑是一種非常有效的方式,快速的創(chuàng)建一個(gè)新的對(duì)象。
二、意圖
? 使用原型實(shí)例指定創(chuàng)建對(duì)象的種類,然后通過拷貝這些原型來創(chuàng)建新的對(duì)象。
三、案例圖
?
?
?
四、原型模式代碼示例
在原型模式中包含的組成部分較少:
抽象原型類:原型類,聲明一需要實(shí)現(xiàn)的接口及clone自身的方法
具體原型類:實(shí)現(xiàn)其余接口及clone自身的方法
?
我們來看這么一個(gè)示例,我記得小時(shí)候上課的時(shí)候有時(shí)候就想著出去玩,就望著窗戶發(fā)呆。又出不去。就想自己可以分身就好了。就可以一個(gè)留在教室學(xué)習(xí),一個(gè)出去玩耍,學(xué)習(xí)可以一次性學(xué)習(xí)多門功課,玩??梢砸淮瓮娑鄠€(gè)游戲。這樣就什么都沒有耽誤,多好呀。當(dāng)然也只是想想,實(shí)現(xiàn)這個(gè)暫時(shí)是不可能的了。雖然說現(xiàn)實(shí)中沒辦法實(shí)現(xiàn)了。剛好今天講原型模式,就借用這個(gè)示例來講解原型模式到底是如何使用的吧:
?
namespace Prototype_Pattern { class PrototypePattern { } #region
抽象原型類===========public abstract class Prototype { /// <summary> /// 當(dāng)前自己的狀態(tài) ///
</summary> public abstract void Status(); /// <summary> /// 當(dāng)前自己在做的事情 ///
</summary> public abstract void Action(string things); /// <summary> /// 拷貝自身的方法
/// </summary> /// <returns></returns> public abstract Prototype Clone(); }
#endregion #region 具體原型類——讀書學(xué)習(xí) ============= public class LearnPrototype :
Prototype {public override void Status() { Console.WriteLine("當(dāng)前狀態(tài):好好學(xué)習(xí)"); }
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("當(dāng)前狀態(tài):開心玩耍"); }
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) { //學(xué)習(xí) Prototype
learnPrototype =new LearnPrototype(); learnPrototype.Status();
learnPrototype.Action("一號(hào)在學(xué)習(xí):語文"); Prototype learnPrototype1 =
learnPrototype.Clone(); learnPrototype.Status(); learnPrototype.Action("二號(hào)在學(xué)習(xí):數(shù)學(xué)
"); //玩耍 Prototype playPrototype = new PlayPrototype(); playPrototype.Status();
playPrototype.Action("一號(hào)在玩耍:游戲王"); Prototype playPrototype1 =
playPrototype.Clone(); learnPrototype.Status(); learnPrototype.Action("
二號(hào)在玩耍:四驅(qū)賽車"); } }
?
使用場(chǎng)景及優(yōu)缺點(diǎn)
一、使用場(chǎng)景
1、在處于資源優(yōu)化的時(shí)候,減少new類的初始化的數(shù)量以減少資源消耗
2、一個(gè)對(duì)象多個(gè)利用修改,將一個(gè)對(duì)象提供給多個(gè)調(diào)用者使用。
二、優(yōu)點(diǎn)
1、原型模式向客戶端隱藏了創(chuàng)建對(duì)象的復(fù)雜性,提供Clone進(jìn)行淺拷貝
2、原型類允許動(dòng)態(tài)的增加或減少產(chǎn)品類
3、產(chǎn)品類不需要先確定產(chǎn)品的等級(jí)結(jié)構(gòu),原型模式適用于任何等級(jí)結(jié)構(gòu)
三、缺點(diǎn)
1、每一個(gè)類都需要配備一個(gè)克隆方法
2、配備克隆方法需要對(duì)類的功能進(jìn)行通盤考慮,這對(duì)于全新的類不是很難,但對(duì)于已有的類不一定很容易,特別當(dāng)一個(gè)類引用不支持串行化的間接對(duì)象,或者引用含有循環(huán)結(jié)構(gòu)的時(shí)候。
總結(jié)
到這里創(chuàng)建型的五個(gè)設(shè)計(jì)模式我們就暫時(shí)的介紹完畢了。
在學(xué)習(xí)設(shè)計(jì)模式的時(shí)候需要多思考,多斟酌。最好在重構(gòu)之時(shí)考慮加入設(shè)計(jì)模式。保證設(shè)計(jì)模式發(fā)揮最大的用處。到這里創(chuàng)建型模式講完了。單例模式關(guān)注的是對(duì)象實(shí)例個(gè)數(shù)的問題。控制對(duì)象僅有一個(gè)實(shí)例,全局訪問調(diào)用。工廠模式和抽象工廠模式解決的是”單個(gè)對(duì)象”及”一系列對(duì)象”的問題。而建造者模式關(guān)注解決的是”對(duì)象部分”的問題。今天講的原型模式可以算的上一個(gè)特殊的工廠模式。原型模式一般極少單獨(dú)使用,一般是配合工廠模式一起使用的。接下來的時(shí)間中給大家?guī)淼氖墙Y(jié)構(gòu)型的設(shè)計(jì)模式解析
平凡人生要用平凡的心去對(duì)待,你的人生將會(huì)更精彩。
C#設(shè)計(jì)模式系列目錄 <https://www.cnblogs.com/hulizhong/p/11394686.html>
歡迎大家掃描下方二維碼,和我一起踏上設(shè)計(jì)模式的闖關(guān)之路吧!
熱門工具 換一換