原型模式

簡介:

       使用原型模式不需要每次都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();

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章