--------------------------------------------------------
本帖的示例下載點:
http://files.cnblogs.com/WizardWu/090713.z " /> H揉捏娇喘乳叫床NP调教视频,动听968,久久99精品久久久久久园产越南

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

C# Design Patterns (5) - Prototype

本帖介紹 Prototype Pattern (原型模式),并以一個「人事招聘程序」作為示例來說明。

--------------------------------------------------------
本帖的示例下載點:
http://files.cnblogs.com/WizardWu/090713.zip
第一個示例為 Console Mode (控制臺應用程序) 項目,第二個示例為 ASP.NET 網站項目。
執行示例需要 Visual Studio 2008 或 IIS + .NET 3.0,不需要數據庫。
--------------------------------------------------------

Prototype Pattern (原型模式)

Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.
                                 - Design Patterns: Elements of Reusable Object-Oriented Software

 

原型模式就是以一個既有的原型實例當作范本,利用復制的方式,動態獲得這個原型實例的狀態以及全部的字段和屬性,以此創建一或多個相同的對象,而且不需要知道任何創建的細節。

Prototype 模式打個通俗的比方:假如您在圖書館看到幾本自己喜歡的書籍,當看到某些知識點時,想在上面作相關記號,但由于其是圖書館的書,不能在上面亂涂亂畫。此時您只好把相關的章節,用復印機把它復印出來,然后在自己復印的紙張上作記號。在 Prototype Pattern 里,Clone 方法就如同此種復印的動作,用戶從一個既有的原型實例 (如同圖書館里的書),復印后得到一或多個新的拷貝,不會破壞原本的原型,且用戶不必知道原型的內容和格式。

Prototype 也具有一種「展示」的意味,就像是車展上的「原型」車款。當您對某個車款感興趣時,您可購買相同的車款,而不是車展上展示的那輛車。

在軟件設計方面,也常需要進行此種對象復制。例如我們要寫一套室內設計軟件,軟件的操作界面上有一條 Toolbar,用戶只要單擊 Toolbar 上的 Button,或用鼠標拖曳到設計窗格中,就可創建一個桌子或椅子的副本,并可事后改變它的顏色或位置。當設計師改變設計圖中的副本對象時,Toolbar 上的「原型」對象并不會跟著被改變。同樣的觀念,亦適用于工業設計 CAD 軟件、圖像處理軟件,以及 Visual Studio 等各種軟件的設計。


Prototype 模式的重點在于 Clone 方法,它負責復制 (克隆) 出一個新的對象并返回,而不是用 new 運算符和某個類的構造函數去創建實例。在此模式中,派生類如何覆寫父類的 Clone 方法將是重點。而 clone 的方式,又可分為「淺拷貝 (shallow copy)」和「深拷貝 (deep copy)」,在介紹這個 Prototype 模式之前,先簡單介紹一下這兩種拷貝方式的差異 [1], [2], [3], [4] :

  • 淺拷貝; 淺表復制 (shallow copy):對象拷貝時,如果字段是「值類型 (Value Type)」,則直接復制其值 (亦即復制整個字段);若字段為「引用類型 (Reference Type)」,則只復制其「引用 (reference; pointer)」,但不復制引用的字段,亦即若更改了任一個副本對象的某一個「引用類型」字段,則原型正本對象、其他副本對象,也全部會一并更改 (如同本帖的第三個示例 02_Employee / 02_ShallowCopy_fail.ASPx.cs),也就是說正本和所有的副本,都指向了內存的同一個位置。
  • 深拷貝; 深層復制 (deep copy):不論對象的字段為「值類型」或「引用類型」,都會完整地復制,而且這些字段和屬性都是完全獨立的。在深拷貝中,所有的對象都是重復的。

另補充,.NET 的類型系統,分為「值類型」、「引用類型」兩種,其對象在內存中的存儲方式不同,如下:

  • 值類型:只需要一段單獨的內存,用于存儲實際的數據在「棧 (Stack)」里,例如:int、byte、float、double、bool、struct、enum、char、...等類型。
  • 引用類型:需要兩段內存,第一段存儲實際的數據,其總是位于「堆 (Heap)」中;第二段是一個存在「棧」里的引用 (reference; pointer),其指向數據在「堆」中的實際存放位置,例如:object、string、class (包括自定義類)、interface、delegate、array (參考本帖的第三、第四個示例) 等類型。

但 string (字符串) 較特殊。string 雖然是「引用類型」,但卻擁有「值類型」的特性。在 Prototype Pattern 及本帖的四個示例中,當透過 MemberwiseClone 方法做「淺拷貝」時,對象的 string 字段仍會被完整地復制,其結果就如同 int 等「值類型」的字段一樣。


如下圖 1 及下方示例 01_Shell,我們可透過自定義的 Prototype 抽象類,搭配 .NET 最頂層基類 System.Object 的 MemberwiseClone 方法,達成對象的「淺拷貝」,亦即復制某個對象其所有「字段 (field)」的值;但在 .NET 中,亦可舍棄此一自定義抽象類,讓圖 1 中的 ConcretePrototype1 類、ConcretePrototype2 類,改為實現 .NET 原生的 System.ICloneable 接口,透過實現此接口唯一的一個 Clone 方法,來達成對象的「淺拷貝」或「深拷貝」。


圖 1 此圖為 Prototype 模式的經典類圖

 

01_Shell / Program.cs

NET技術C# Design Patterns (5) - Prototype,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 色多多深夜福利免费观看 | 亚洲成人综合在线 | 国产欧美一本道无码 | 再深点灬舒服灬太大了在线视频 | 男女生爽爽爽视频免费观看 | 亚洲日本在线不卡二区 | 大香伊人中文字幕精品 | 护士被老头边摸边吃奶的视频 | 最近中文字幕完整版免费 | 丰满老熟好大bbbxxx | 九九在线中文字幕无码 | 亚洲日韩在线天堂一 | 一边捏奶头一边啪高潮会怎么样 | 69精品国产人妻蜜桃国产毛片 | 午夜性色一区二区三区不卡视频 | 三级黄色网 | 男人的天堂色偷偷 | 亚洲精品久久一区二区三区四区 | 亚洲国产果果在线播放在线 | 久久午夜宫电影网 | 一本色道久久综合亚洲精品蜜桃冫 | chinesedaddy80老年人 | 国产女合集第六部 | 香蕉尹人综合精品 | 国产精品乱码一区二区三 | yy4408午夜场理论片 | 99re久久热最新地址一 | 国产精品久久久久影院 | 国产睡熟迷奷系列网站 | 污到湿的爽文免费阅读 | 日本色女孩影院 | 失禁 调教 刺激 哭喊男男 | 娇妻中日久久持久久 | 十分钟免费看完整视频 | 后入到高潮免费观看 | 国产AV99激情久久无码天堂 | 古代荡女丫鬟高H辣文纯肉 姑娘视频日本在线播放 | 国产婷婷午夜无码A片 | 日本888xxxx| 综合色一色综合久久网vr | 一本道手机无码在线看 |