簡介:
使用原型模式不需要每次都new一個新的實例,而是通過拷貝原有的對象來完成創建,這樣不需要在內存中創建多個對象,也不需要重複複雜的創建過程了。實際修改對象的時候需要注意淺複製帶來的影響,引用對象實際上是同一個對象。
介紹:
優點 |
1.隱藏了創建實例的繁瑣過程,只需通過Clone方法就可以獲取實例對象。 2.用淺拷貝替代new,減少資源消耗。 |
缺點 |
1.需要添加一個Clone方法,一般使用MemberwishClone方法來獲取實例的淺拷貝副本。 (如果想實現深拷貝常用的有兩種方法:①將原始實例序列化,然後反序列化賦值給副本對象;②淺拷貝+遞歸的方式,類似於遍歷文件夾,對所有的複雜屬性、複雜屬性內部的複雜屬性都進行淺拷貝。) |
使用:
//原型抽象類
public abstract class Prototype
{
public abstract void GetDraw();
public abstract void GetPrint();
//克隆
public abstract Prototype Clone();
}
//繼承抽象原型類
public sealed class SquarePrototype : Prototype
{
public override void GetDraw()
{
//do something
}
public override void GetPrint()
{
//do something
}
public override Prototype Clone()
{
return (SquarePrototype)this.MemberwiseClone();//淺拷貝,即引用類型是同一個對象
}
}
//繼承抽象原型類
public sealed class CirclePrototype : Prototype
{
public override void GetDraw()
{
//do something
}
public override void GetPrint()
{
//do something
}
public override Prototype Clone()
{
return (CirclePrototype)this.MemberwiseClone();
}
}
//原型模式調用
Prototype squareProto = new SquarePrototype(); //原型
Prototype squareProto2 = squareProto.Clone(); //拷貝
Prototype squareProto3 = squareProto.Clone(); //拷貝
squareProto.GetDraw();
squareProto.GetPrint();
squareProto2.GetDraw();
squareProto2.GetPrint();
squareProto2.GetDraw();
squareProto2.GetPrint();
Prototype circleProto = new CirclePrototype();
Prototype circleProto2 = circleProto.Clone();
Prototype circleProto3 = circleProto.Clone();
circleProto.GetDraw();
circleProto.GetPrint();
circleProto2.GetDraw();
circleProto2.GetPrint();
circleProto3.GetDraw();
circleProto3.GetPrint();