大话设计模式-原型模式(学习笔记)

2014-11-24 01:25:31 · 作者: · 浏览: 0
原型模式(prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
原型模式结构图: \

基本原型代码: 原型类 abstract class Prototype
{
private string id;


public Prototype(string id) {
this.id = id;
}


public string Id {
get { return id; }
}


public abstract Prototype Clone();< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjxicj4KICAgIH08YnI+Cjxicj4Kvt/M5dSt0M3A4KO6Cjxicj4KCiAgICBjbGFzcyBDb25jcmV0ZVByb3RvdHlwZTEgOiBQcm90b3R5cGUgezxicj4KICAgICAgICBwdWJsaWMgQ29uY3JldGVQcm90b3R5cGUxKHN0cmluZyBpZCkgOiBiYXNlKGlkKSB7IDxicj4KICAgICAgICAgICAgPGJyPgogICAgICAgIH08YnI+CiAgICAgICAgcHVibGljIG92ZXJyaWRlIFByb3RvdHlwZSBDbG9uZSgpPGJyPgogICAgICAgIHs8YnI+CiAgICAgICAgICAgIC8vtLS9qLWxx7C21M/xtcQ8c3Ryb25nPsezse24sbG+o6y3vbeoyse0tL2o0ru49tDCttTP86OsyLu6872rx7DD5rbUz/OwurXEt8e+ssys19a2zri01sa1vbjD0MK21M/zoaPI57n719a2zsrHJiMyMDU0MDvA4NDNtcSjrNTyttS4w9fWts7WtNDQ1u7Ou7i01saho8jnufvX1rbOysfS/dPDwODQzaOs1PK4tNbG0v3Tw7Wrsru4tNbG0v3Tw7bUz/Oju9LytMujrNStyry21M/z0tS8sMbkuLGxvtL908PNrNK7ttTP86GjPC9zdHJvbmc+CiAgICAgICAgICAgIHJldHVybiAoUHJvdG90eXBlKXRoaXMuTWVtYmVyd2lzZUNsb25lKCk7PGJyPgogICAgICAgIH08YnI+CiAgICB9Cjxicj4KCr/Nu6e2y7T6wuujugo8YnI+CgogICAgICAgICAgICBDb25jcmV0ZVByb3RvdHlwZTEgcDEgPSBuZXcgQ29uY3JldGVQcm90b3R5cGUxKA=="I");
ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();//克隆类,得到当前对象。
Console.WriteLine("Coloned:{0}", p1.Id);
Console.WriteLine("Coloned:{0}",c1.Id);
Console.Read()
具体实例(深复制与浅复制) 浅复制结构图:

\
深复制结构图


\

代码: //定义了一个Clone方法,对自身进行克隆
//浅复制没有继承ICloneable接口,也没有 Clone方法的实现
class WorkExperence:ICloneable {
private string workDate;
private string company;
public string WorkDate {
set { workDate = value;}
get {return workDate;}
}
public string Company {
set { company = value; }
get { return company; }
}
public Object Clone() {
return (Object)this.MemberwiseClone();
}


}

//继承距ICloneable接口(system命名空间中)
class Resume:ICloneable
{
private string name;
private string age;
private string sex;


private WorkExperence work;


public Resume(string name) {
this.name = name;
work = new WorkExperence();
}
//实现对资源对象进行深复制的构造函数
public Resume(WorkExperence work) {
this.work = (WorkExperence)work.Clone();
}


public void SetPersonalInfo(string sex,string age){
this.sex = sex;
this.age = age;


}


public void SetWorkExperence(string workDate,string company) {
work.WorkDate = workDate;
work.Company = company;
}


public void Display() {
Console.WriteLine("{0} {1} {1}",name,sex,age);
Console.WriteLine("工作经历:{0} {1}",work.WorkDate,work.Company);
}
//浅复制
public Object Clone() {
return (Object)this.MemberwiseClone();
}
//深复制
public Object CloneH() { //调用私有构造方法,让“工作经历”克隆完成,然后在给“简历”对象的相关字段赋值,最终返回一个深复制对象
Resume obj = new Resume(this.work);
obj.name = this.name;
obj.sex = this.sex;
obj.age = this.age;
return obj;
}
}
前台代码:
static void Main(string[] args)
{
Resume r1 = new Resume("人物A");


r1.SetPersonalInfo("男", "25");
r1.SetWorkExperence("5", "marchsoft");


Resume r2 =(Resume) r1.Clone();


r2.SetPersonalInfo("女","22");
r2.SetWorkExperence("2", "sun");


Resume r3 = (Resume)r2.CloneH();
r3.SetWorkExperence("10", "IBM");
r3.SetPersonalInfo("男","35");


r1.Display();
r2.Display();
r3.Display();



Console.Read();


}

结果如图: 原型模式结果.png

小结:
浅复制,被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用动仍然指向原来的对象。
深复制,把引用对象的变量只想复制过的新对象,而不是原有的被引用的对象。
优点:一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这即隐藏了对象创建的细节,有对性能是大大的提高。它等于不用重新初始化对象,而是动态的或侧对象运行时的状态。