c#原型模式
1、定义
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要任何创建的细节。
2、深复制和浅复制
1.深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象
2.被复制对象的所有对象都含有与原来对象相同的值,而所有的对其他对象的引用都任然指向原来的对象
3、实现原理
- UML类图
2.代码实现
//抽象的原型类
abstract class AProtoType
{
private string id;
public AProtoType(string id)
{
this.id = id;
}
public string ID
{
get { return id; }
}
//Clone()方法,抽象的关键
public abstract AProtoType Clone();
}
//具体的原型类
class ConcreteProtoTypeA : AProtoType
{
public ConcreteProtoTypeA(string id) : base(id)
{
}
public override AProtoType Clone()
{
//创建当前对象的浅表副本。方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。
//如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;
//因此原始对象及其副本引用同一个对象
return (AProtoType)this.MemberwiseClone();
}
}
客户端:
class Program
{
static void Main(string[] args)
{
ConcreteProtoTypeA ct = new ConcreteProtoTypeA("123");
//克隆类ConcreteProtoTypeA的对象ct能得到新的实例copy
ConcreteProtoTypeA copy =(ConcreteProtoTypeA) ct.Clone();
Console.WriteLine("Cloned:{0}",copy.ID);
Console.ReadKey();
}
}
输出:Cloned:123
4、实例
简历的原型实现:
4.1UML类图
4.2代码实现
//简历类,实现可复制接口
class PersonResume : ICloneable
{
private string name;
private string sex;
private string age;
private string timeArea;
private string company;
public PersonResume(string name)
{
this.name = name;
}
//设置个人信息
public void SetInfo(string sex,string age)
{
this.age = age;
this.sex = sex;
}
//设置工作经历
public void WorkExprience(string timearea,string company)
{
this.timeArea = timearea;
this.company = company;
}
//显示
public void Show()
{
Console.WriteLine("{0},{1},{2}",name,sex,age);
Console.WriteLine("{0},{1}",timeArea,company);
}
//实现接口的方法,用来克隆对象
public object Clone()
{
return (object)this.MemberwiseClone();
}
}
客户端:
class Program
{
static void Main(string[] args)
{
PersonResume pr = new PersonResume(“DZB”);
pr.SetInfo(“Man”,”18”);
pr.WorkExprience(“Three years”,”WKD”);
PersonResume copy = (PersonResume)pr.Clone();
copy.WorkExprience("Four Years","WKDCY");
pr.Show();
copy.Show();
Console.ReadKey();
}
}
输出:DZB Man 18 Three years WKD
DZB Man 18 Four years WKDCY