[Serializable]
public abstract class MyControlBase
{
/// <summary>
/// 数据源
/// </summary>
public System.Data.DataSet MyDataSource { get; set; }
/// <summary>
/// 作者
/// </summary>
public string Author { get; set; }
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);
}
public abstract class MyControlBase
{
/// <summary>
/// 数据源
/// </summary>
public System.Data.DataSet MyDataSource { get; set; }
/// <summary>
/// 作者
/// </summary>
public string Author { get; set; }
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);
}