设计模式之原型模式
来源:互联网 发布:南昌大学教学网络平台 编辑:程序博客网 时间:2024/05/22 06:08
原型模式(Prototype):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。换句话说,原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。
原型模式最大的特点是克隆一个现有的对象,一般是由对象的内部提供克隆方法。
原型模式的结构图:
基本的原型模式的代码:
//原型类 abstract class Prototype { private string id; public Prototype(string id) { this.id = id; } public string Id { get { return id; } } } //具体原型类 class ConcretePrototype1 : Prototype { public ConcretePrototype1(string id) : base(id) { } public override Prototype Clone() { return (Prototype)this.MemberwiseClone(); } }//客户端代码 static void Main(string[] AssemblyLoadEventArgs) { ConcretePrototype1 p1=new ConcretePrototype("I"); ConcretePrototype1 c1=(ConcretePrototype)p1.Clone(); Console.WriteLine("Cloned:{0}",c1 .Id ); Console.Read(); }
例子:要求有一个简历类,必须要有姓名,可以设置性别和年龄,可以设置工作经历。最终需要三份简历。
结构图:
代码:
//原型模式,简历类 class Resume : ICloneable { private string name; private string sex; private string age; private string timeArea; private string company; public Resume(string name) { this.name = name; } //设置个人信息 public void SetPersonalInfo(string sex, string age) { this.sex = sex; this.age = age; } //设置工作经历 public void SetWorkExperience(string timeArea, string company) { this.timeArea = timeArea; this.company = company; } //显示 public void Display() { Console.WriteLine("{0} {1} {2}", name, sex, age); Console.WriteLine("{0} {1}", timeArea, company); } public Object Clone() { return (Object)this.MemberwiseClone(); } }
//客户端代码
static void Main(string[] args) { Resume a = new Resume("大鸟"); a.SetPersonalInfo("男","29"); a.SetWorkExperience("1998-2000","XX公司");
Resume b = (Resume)a.Clone(); b.SetWorkExperience("1998-2006", "YY公司");
Resume c = (Resume)a.Clone(); c.SetPersonalInfo("男", "24"); a.Display(); b.Display(); c.Display();
Console.Read();}
结果显示:
大鸟 男 29
工作经历 1998-2000 XX公司
大鸟 男 29
工作经历 1998-2006 YY公司
大鸟 男 24
工作经历 1998-2000 XX公司
深复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
浅复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
举个例子区分一下,现在,“简历”类中有个设置工作经历的方法,一般会再有一个工作经历类,当中有时间区间和公司名称等属性,简历类直接调用这个对象即可。
结构图:
浅复制代码:
//浅复制 //工作经历类 class WorkExperience { private string workDate; public string WorkDate { get { return workDate ; } set { workDate = value; } } private string company; public string Company { get { return company;} set { company = value; } } } //简历类 class Resume : ICloneable { private string name; private string sex; private string age; private WorkExperience work; public Resume(string name) { this.name = name; work = new WorkExperience(); } //设置个人信息 public void SetPersonalInfo(string sex, string age) { this.sex = sex; this.age = age; } //设置工作经历 public void SetWorkExperience(string workDate, string company) { work.WorkDate = workDate; work.Company = company; } //显示 public void Display() { Console.WriteLine("{0} {1} {2}", name, sex, age); Console.WriteLine("{0} {1}", work.WorkDate , work.Company ); } public Object Clone() { return (Object)this.MemberwiseClone(); } }
//客户端代码
static void Main(string[] args) { Resume a = new Resume("大鸟"); a.SetPersonalInfo("男","29"); a.SetWorkExperience("1998-2000","XX公司");
Resume b = (Resume)a.Clone(); b.SetWorkExperience("1998-2006", "YY公司");
Resume c = (Resume)a.Clone(); c.SetPersonalInfo("男", "24"); c.SetWorkExperience("1998-2003","zz企业");
a.Display(); b.Display(); c.Display();
Console.Read();}
结果显示:
大鸟 男 29
工作经历 1998-2003 ZZ企业
大鸟 男 29
工作经历 1998-2003 ZZ企业
大鸟 男 24
工作经历 1998-2003 ZZ企业
深复制代码:
//工作经历类 //深复制 class WorkExperience:ICloneable { private string workDate; public string WorkDate { get { return workDate ; } set { workDate = value; } } private string company; public string Company { get { return company;} set { company = value; } } public Object Clone() { return (Object)this.MemberwiseClone(); } } //简历类 class Resume : ICloneable { private string name; private string sex; private string age; private WorkExperience work; public Resume(string name) { this.name = name; work = new WorkExperience(); } //深复制区别于浅复制 private Resume(WorkExperience work) { this.work = (WorkExperience)work.Clone(); } //设置个人信息 public void SetPersonalInfo(string sex, string age) { this.sex = sex; this.age = age; } //设置工作经历 public void SetWorkExperience(string workDate, string company) { work.WorkDate = workDate; work.Company = company; } //显示 public void Display() { Console.WriteLine("{0} {1} {2}", name, sex, age); Console.WriteLine("{0} {1}", work.WorkDate , work.Company ); } public Object Clone() { //深复制区别于浅复制 Resume obj = new Resume(this.work); obj .name =this .name ; obj .sex =this .sex ; obj .age =this .age ; return obj ; } }
客户端代码一样,但是结果:
大鸟 男 29
工作经历 1998-2000 XX公司
大鸟 男 29
工作经历 1998-2006 YY公司
大鸟 男 24
工作经历 1998-2003 ZZ企业
浅复制和深复制的结果显然不一样,就是因为,浅复制复制的对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象,这里三次的结果都是最后一次设置的值。而深复制将引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
- 设计模式之原型
- 设计模式之原型
- 设计模式 之 原型
- 设计模式之原型
- 设计模式之原型
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之-原型模式
- 设计模式之 原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之--原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- Java静态导入
- servlet中的配置方法
- Qt下如何获得本地网卡IP
- NET探秘:MSIL权威指南学习笔记(速读4-16)
- MySQL数据库灾难恢复
- 设计模式之原型模式
- Delphi XE 调用 C++ Builder XE 开发的DLL库
- aix 误删HD5或者损毁修复
- Linux进程控制
- python类定义内部调用对象的实例
- web.py等框架如何生成静态网页
- 为啥现阶段还是学习python2.X,不学python3
- 旅行售货员问题(回溯、分枝限界)
- linux学习笔记0