9.3 原型模式
原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
抽象原型类:
abstract class Prototype { private string id; public Prototype(string id) { this.id = id; } public string Id { get { return id; } } public abstract Prototype Clone(); //抽象类关键就是有这样一个Clone方法 }
具体原型类:
class ConcretePrototype : Prototype { public ConcretePrototype(string id) : base(id) { } public override Prototype Clone() { return (Prototype)this.MemberwiseClone(); //创建当前对象的浅表副本。方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的, //则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象:因此,原始对象及其副本引用为同一对象 } }
客户端代码:
static void Main(string[] args) { ConcretePrototype p1 = new ConcretePrototype("I"); ConcretePrototype c1 = (ConcretePrototype)p1.Clone(); //克隆ConcretePrototype的对象p1就能得到新的实例c1 Console.WriteLine("Cloned:{0}", c1.Id); Console.Read(); }
一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高。
9.5 浅复制与深复制
MemberwiseClone() 方法是这样的,如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其副本引用同一对象。换句话说就是,如果你的“简历”类当中有对象引用,
那么引用的对象数据是不会被克隆过来的。
举个例子你就明白了,你现在的“简历”类当中有一个“设置工作经历”的方法,在显示设计当中,一般会再有一个“工作经历”类,当中有“时间区间”和“公司名称”等属性,“简历”类直接调用这个对象即可。
工作经历类:
class WorkExperience { public string WorkDate { get; set; } //好像是使用这种方式类中所有的属性都要使用这种方式,所以这种方式好像只适合那些其他方法并不调用私有变量的类 public string Company { get; set; } }
简历类: