设计模式原型模式

 [Serializable]
    public abstract class MyControlBase
    {
        /// <summary>
        
/// 数据源
        
/// </summary>
        public System.Data.DataSet MyDataSource { getset; }

        /// <summary>
        
/// 作者
        
/// </summary>
        public string Author { getset; }


        protected string Serialize()
        {
            using (System.IO.MemoryStream ms= new System.IO.MemoryStream () )
            {
                new BinaryFormatter().Serialize(ms, this);
                return Convert.ToBase64String(ms.ToArray());
            }
        }

        protected MyControlBase Deserialize(string objString)
        {
            byte[] objArr= Convert.FromBase64String(objString);
            using (MemoryStream ms = new MemoryStream (objArr) )
            {
                return new BinaryFormatter().Deserialize(ms) as MyControlBase;
            }
        }

        public abstract MyControlBase Clone();
    }

    /// <summary>
    
/// 面板
    
/// </summary>
    [Serializable]
    public class MyPanel : MyControlBase
    {
        public override MyControlBase Clone()
        {
            string objStr= Serialize();
            return Deserialize(objStr);
        }
    }
//----------------------test
 public static void PrototypePattern()
        {
            //原型模式用来创建对象,但不是用new的方式,
            
//而是用类似clone的方式,既然是clone,那么首先
            
//要有一个初始的被clone的对象。
            
//一,原型模式目的:
            
//1,创建复杂对象,降低初始化成本(有的对象的构造函数里面会执行一堆操作)。
            
//2,简化客户端的创建对象工作(比如创建一个对象需要传一堆参数等等)。
            
//二,原型模式应用:
            
//1,VS上工具栏上面的控件。2,游戏中的小兵的创建。
            
//三,本示例用序列化来实现对象的clone,这样可以保证对象的完全clone(包括深clone),
            
//你也可以手工实现浅复制和深复制。
            MyPanel pnlTop = new MyPanel();
            pnlTop.Author = "zhaoyang";

            Button btnTop = new Button (){ ToolTip="顶部按钮"};
            pnlTop.MyDataSource = new DataSet("ds1");

            MyPanel pnlMain = pnlTop.Clone() as MyPanel;
            pnlMain.Author = "litao";


            Console.WriteLine(pnlTop.Author);
            Console.WriteLine(pnlTop.MyDataSource.DataSetName);
            Console.WriteLine(pnlMain.Author);
            Console.WriteLine(pnlMain.MyDataSource.DataSetName);
        }
原文地址:https://www.cnblogs.com/imap/p/2627831.html