.Net设计模式_原型模式
引言:
原型,感覺就是拷貝,只是給拷貝分了深拷貝和淺拷貝。
?
理解:
在C#.Net里面,我們可以很容易的通過Clone()方法實(shí)現(xiàn)原型模式。
任何類,只要想支持克隆,必須實(shí)現(xiàn)C#中的ICloneable接口。
ICloneable接口中有一Clone方法,可以在類中復(fù)寫實(shí)現(xiàn)自定義的克隆方法。
克隆的實(shí)現(xiàn)方法有兩種:淺拷貝(shallow copy)與深拷貝(deep copy)。
說明:淺拷貝是指當(dāng)對(duì)象的字段值被拷貝時(shí),字段引用的對(duì)象不會(huì)被拷貝。而深拷貝是對(duì)對(duì)象實(shí)例中字段引用的對(duì)象也進(jìn)行拷貝的一種方式。
UML圖:(出之http://www.cnblogs.com/zhenyulu/articles/39257.html)
?
示例代碼:
public interface IObjectOne {IObjectOne Clone();void Write(); } // Object public class Object1 : IObjectOne {public String _val = "A";public User _user = new User();public IObjectOne Clone(){_user.Name = "A name";return (IObjectOne)this.MemberwiseClone();}public void Write(){Console.WriteLine(_user.Name);Console.WriteLine("Object " + _val);} } // 實(shí)體 public class User {public String Name { get; set; } }調(diào)用
static void Main(string[] args) {Object1 obj = new Object1();Object1 objCopy = (Object1)obj.Clone();// 值類型objCopy._val = "AA";// 引用類型objCopy._user.Name = "AA name";objCopy.Write();obj.Write();Console.ReadKey(); }結(jié)果
從結(jié)果我們看出,MemberwiseClone方法是淺拷貝,因?yàn)橹挥兄殿愋偷谋豢截惲?#xff0c;引用類型的沒有被拷貝。
理解拷貝:
public interface IObjectTwo {// 淺拷貝 IObjectTwo Clone();// 深拷貝 IObjectTwo DeepClone(String name);// 輸出void Write(); }public class Object3 : IObjectTwo {public String _val = "A";public User _user = new User();public Object3(){_user.Name = "A name";}// 淺拷貝public IObjectTwo Clone(){return (IObjectTwo)this.MemberwiseClone();}// 深拷貝public IObjectTwo DeepClone(String name){Object3 nowObj = new Object3();User obj = new User();obj.Name = name;nowObj._val = this._val;nowObj._user = obj;return (IObjectTwo)nowObj;}// 輸出public void Write(){Console.WriteLine(_user.Name);Console.WriteLine("Object " + _val);} } static void Main(string[] args) {Object1 obj = new Object1();Object1 objCopy = (Object1)obj.Clone();// 值類型objCopy._val = "AA";// 引用類型objCopy._user.Name = "AA name";objCopy.Write();obj.Write();Console.WriteLine();Console.WriteLine("--------------------");Console.WriteLine();Object3 nowObj = new Object3();Object3 objCopy2 = (Object3)nowObj.Clone();objCopy2._val = "XX";objCopy2._user.Name = "XX name";objCopy2.Write();// 深拷貝Object3 objCopy3 = (Object3)nowObj.DeepClone("My Name");objCopy3._val = "YY";objCopy3.Write();objCopy3._user.Name = "Test";objCopy3.Write();nowObj.Write();Console.ReadKey(); } }結(jié)果:
從結(jié)果知道,拷貝一個(gè)引用類型,一定是New這個(gè)對(duì)象。這個(gè)其實(shí)跟堆棧有關(guān),當(dāng)new一個(gè)對(duì)象時(shí),會(huì)在堆上面新分配一個(gè)區(qū)域,用于新對(duì)象的存儲(chǔ)。
但是給一個(gè)引用對(duì)象賦值另一個(gè)引用對(duì)象時(shí),是把引用的指針給了對(duì)象,并沒有重新分配存儲(chǔ)區(qū)域,所以修改這個(gè)對(duì)象就會(huì)影響,整個(gè)上下文中的這個(gè)對(duì)象,
因?yàn)?#xff0c;修改的是一個(gè)存儲(chǔ)區(qū)域。
?
總結(jié):(出之http://www.cnblogs.com/zhenyulu/articles/39257.html)
1、Prototype模式允許動(dòng)態(tài)增加或減少產(chǎn)品類。由于創(chuàng)建產(chǎn)品類實(shí)例的方法是產(chǎn)批類內(nèi)部具有的,因此增加新產(chǎn)品對(duì)整個(gè)結(jié)構(gòu)沒有影響。
2、Prototype模式提供了簡(jiǎn)化的創(chuàng)建結(jié)構(gòu)。工廠方法模式常常需要有一個(gè)與產(chǎn)品類等級(jí)結(jié)構(gòu)相同的等級(jí)結(jié)構(gòu),而Prototype模式就不需要這樣。
3、Portotype模式具有給一個(gè)應(yīng)用軟件動(dòng)態(tài)加載新功能的能力。由于Prototype的獨(dú)立性較高,可以很容易動(dòng)態(tài)加載新功能而不影響老系統(tǒng)。
4、產(chǎn)品類不需要非得有任何事先確定的等級(jí)結(jié)構(gòu),因?yàn)镻rototype模式適用于任何的等級(jí)結(jié)構(gòu)。
?
應(yīng)用場(chǎng)景:
如:一個(gè)方法,里面的參數(shù)是一個(gè)實(shí)體類,ProcessMessage(User userInfo),而調(diào)用這個(gè)方法的方法是ReturnProcess()
public void ReturnProcess(){
User userInfo = new User();
????? // 調(diào)用前
......
ProcessMessage(userInfo);
//調(diào)用后
......
}
那么,在ProcessMessage修改對(duì)象uerInfo,會(huì)直接影響到 調(diào)用后,userInfo的值。
所以在一些設(shè)計(jì)中需要考慮子方法中修改對(duì)象帶來的影響,
所以我們需要深拷貝和淺拷貝。
也就是我們說的原型模式。
?
代碼下載:
百度網(wǎng)盤 http://pan.baidu.com/s/1c0iSVlu
CSDN? http://download.csdn.net/detail/hater22/6847203
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/kimi-gyj/p/3517154.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的.Net设计模式_原型模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数学:《线性代数》矩阵运算
- 下一篇: 图文详解远程部署ASP.NET MVC