老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

C#設計模式(6)——原型模式(PrototypePattern)

一、引言

在軟件系統中,當創建一個類的實例的過程很昂貴或很復雜,并且我們需要創建多個這樣類的實例時,如果我們用new操作符去創建這樣的類實例,這未免會增加創建類的復雜度和耗費更多的內存空間,因為這樣在內存中分配了多個一樣的類實例對象,然后如果采用工廠模式來創建這樣的系統的話,隨著產品類的不斷增加,導致子類的數量不斷增多,反而增加了系統復雜程度,所以在這里使用工廠模式來封裝類創建過程并不合適,然而原型模式可以很好地解決這個問題,因為每個類實例都是相同的,當我們需要多個相同的類實例時,沒必要每次都使用new運算符去創建相同的類實例對象,此時我們一般思路就是想——只創建一個類實例對象,如果后面需要更多這樣的實例,可以通過對原來對象拷貝一份來完成創建,這樣在內存中不需要創建多個相同的類實例,從而減少內存的消耗和達到類實例的復用。 然而這個思路正是原型模式的實現方式。下面就具體介紹下設計模式中的原型設計模式。

網站建設哪家好,找成都創新互聯!專注于網頁設計、網站建設、微信開發、小程序設計、集團企業網站建設等服務項目。為回饋新老客戶創新互聯還提供了印臺免費建站歡迎大家使用!

二、原型模式的詳細介紹

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

///火影忍者中鳴人的影分身和孫悟空的的變都是原型模式
    class Client
    {
        static void Main(string[] args)
        {
            // 孫悟空 原型
            MonkeyKingPrototype prototypeMonkeyKing = new ConcretePrototype("MonkeyKing");
            // 變一個
            MonkeyKingPrototype cloneMonkeyKing = prototypeMonkeyKing.Clone() as ConcretePrototype;
            Console.WriteLine("Cloned1:\t"+cloneMonkeyKing.Id);
            // 變兩個
            MonkeyKingPrototype cloneMonkeyKing2 = prototypeMonkeyKing.Clone() as ConcretePrototype;
            Console.WriteLine("Cloned2:\t" + cloneMonkeyKing2.Id);
            Console.ReadLine();
        }
    }
    /// 
    /// 孫悟空原型
    /// 
    public  abstract class MonkeyKingPrototype
    {
        public string Id { get; set; }
        public MonkeyKingPrototype(string id)
        {
            this.Id = id;
        }
        // 克隆方法,即孫大圣說“變”
        public abstract MonkeyKingPrototype Clone();
    }
    /// 
    /// 創建具體原型
    /// 
    public class ConcretePrototype : MonkeyKingPrototype
    {
        public ConcretePrototype(string id)
            : base(id)
        { }
        /// 
        /// 淺拷貝
        /// 
        /// 
        public override MonkeyKingPrototype Clone()
        {
            // 調用MemberwiseClone方法實現的是淺拷貝,另外還有深拷貝
            return (MonkeyKingPrototype)this.MemberwiseClone();
        }
    }

上面原型模式的運行結果為(從運行結果可以看出,創建的兩個拷貝對象的ID屬性都是與原型對象ID屬性一樣的):

上面代碼實現的淺拷貝的方式,淺拷貝是指當對象的字段值被拷貝時,字段引用的對象不會被拷貝。例如,如果一個對象有一個指向字符串的字段,并且我們對該對象做了一個淺拷貝,那么這兩個對象將引用同一個字符串,而深拷貝是對對象實例中字段引用的對象也進行拷貝,如果一個對象有一個指向字符串的字段,并且我們對該對象進行了深拷貝的話,那么我們將創建一個對象和一個新的字符串,新的對象將引用新的字符串。也就是說,執行深拷貝創建的新對象和原來對象不會共享任何東西,改變一個對象對另外一個對象沒有任何影響,而執行淺拷貝創建的新對象與原來對象共享成員,改變一個對象,另外一個對象的成員也會改變。

介紹完原型模式的實現代碼之后,下面看下原型模式的類圖,通過類圖來理清原型模式實現中類之間的關系。

三、原型模式的優缺點

原型模式的優點有:

  1. 原型模式向客戶隱藏了創建新實例的復雜性

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

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

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

原型模式的缺點有:

  1. 每個類必須配備一個克隆方法

  2. 配備克隆方法需要對類的功能進行通盤考慮,這對于全新的類不是很難,但對于已有的類不一定很容易,特別當一個類引用不支持串行化的間接對象,或者引用含有循環結構的時候。

四、.NET中原型模式的實現

在.NET中可以很容易地通過實現ICloneable接口(這個接口就是原型,提供克隆方法,相當于與上面代碼中MonkeyKingPrototype抽象類)中Clone()方法來實現原型模式,如果我們想我們自定義的類具有克隆的功能,首先定義類繼承與ICloneable接口并實現Clone方法。在.NET中實現了原型模式的類如下圖所示(圖中只截取了部分,可以用Reflector反編譯工具進行查看):

五、總結

到這里關于原型模式的介紹就結束了,原型模式用一個原型對象來指明所要創建的對象類型,然后用復制這個原型對象的方法來創建出更多的同類型對象,它與工廠方法模式的實現非常相似,其中原型模式中的Clone方法就類似工廠方法模式中的工廠方法,只是工廠方法模式的工廠方法是通過new運算符重新創建一個新的對象(相當于原型模式的深拷貝實現),而原型模式是通過調用MemberwiseClone方法來對原來對象進行拷貝,也就是復制,同時在原型模式優點中也介紹了與工廠方法的區別(第三點)。

附件:http://down.51cto.com/data/2363531

網站名稱:C#設計模式(6)——原型模式(PrototypePattern)
文章出自:http://www.xueling.net.cn/article/isggcj.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 欧美丰腴丰满大屁股熟妇 | 日日干日日操 | 深夜福利网站 | 麻豆精品久久久久久中文字幕无码 | 奇米7777狠狠狠琪琪视频 | 色老板最新地址入口处 | 亚洲激情四射视频中文字幕久久 | 国产公妇仑乱在线观看 | 看真人视频a级毛片 | 国产成人久久综合777777麻豆 | 国内性爱一区二区 | 久久99久久99 | 麻豆网站免费观看 | 午夜成人免费视频 | 9l亚洲国产成人精品一区二三 | 国产精品18久久久久久白浆动漫 | 97SE狠狠狠狠狼鲁亚洲综合色 | 老司机精品久久 | 日本免费一区二区三区四区五六区 | 欧美性生恔XXXXXDDDD | 亚洲va中文字幕无码久久不卡 | 蜜桃www视频高清在线观看 | 三年中文在线观看免费大全 | 国内性爱一区二区 | 91.成人天堂一区 | 中文字幕视频播放 | 欧美综合人人做人人爱 | 精品视频在线观看99 | 欧美一区二区三区四区视频 | 日本免费在线视频不卡一不卡二 | AV无码专区亚洲AV极速版 | 日木AV无码专区亚洲AV毛片 | 日韩一线无码AV毛片免费 | 熟女人妻AV完整一区二区三区 | 51porn国产| 人妻激情偷乱一区二区三区 | 91超碰九色| 亚洲AV第一成肉网 | 亚洲熟妇无码AV不卡在线播放 | 在线免费观看日本 | 亚洲国产精品乱码一区二区 |