Gof定义
使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。
动机
在软件系统中,经常面临着“某些结构复杂的对象”的创建工作,但由于需求的变化,这些对象将成面临着剧烈的变化,但他们拥有比较稳定一致的接口。
原型模式(Prototype)的几个要点
- Prototype模式同样用于隔离类对象的使用者和具体类型(易变类型)之间的耦合关系,同样要求这些易变类型具有稳定的接口。
- Prototype模式对于“如何创建易变类的实体对象”采用原型克隆的方法来做,他使得我们可以非常灵活的动态创建“拥有某些稳定接口”的新对象–所需工作仅仅是注册一个新类的对象(原型),然后在任何需要的地方不断地Clone。
- Prototype模式中的克隆方法可以利用Net中的Object类的MemberwiseClone方法或是序列化来实现深拷贝。
最基本的实现代码 (通过this.MemberwiseClose来实现拷贝)
View Code
using System; using System.Collections.Generic; using System.Linq;<font color="#000000"></font> using System.Text; namespace 原型模式 { class Program { static void Main(string[] args) { ConcreteProtypeA p1 = new ConcreteProtypeA("Demo"); ConcreteProtypeA p2 = (ConcreteProtypeA)p1.Clone(); Console.WriteLine(p2.Id); Console.ReadLine(); } } abstract class Prototype { private string id; public string Id { get { return id; } set { id = value; } } public Prototype(string id) { this.id = id; } public abstract Prototype Clone(); } class ConcreteProtypeA : Prototype { public ConcreteProtypeA(string id) : base(id) { } public override Prototype Clone() { return (Prototype)this.MemberwiseClone(); } } }
通过实现接口ICloneable来改进上面最基本的代码
View Code
namespace 原型模式 { class Program { static void Main(string[] args) { ConcreteProtypeA p1 = new ConcreteProtypeA("Demo"); ConcreteProtypeA p2 = (ConcreteProtypeA)p1.Clone(); Console.WriteLine(p2.Id); Console.ReadLine(); } } class ConcreteProtypeA : ICloneable { private string id; public string Id { get { return id; } set { id = value; } } public ConcreteProtypeA(string id) { this.id = id; } public object Clone() { return (object)this.MemberwiseClone(); } } }
自己写的一个简单例子:
View Code
class Program { static void Main(string[] args) { ConcreteProtypeA p1 = new ConcreteProtypeA(); ConcreteProtypeA p2 = (ConcreteProtypeA)p1.Clone(); Console.WriteLine(p2.name); p2.SayHello(); Console.ReadLine(); } } class ConcreteProtypeA : ICloneable { public string id = "1"; public string name = "Jie"; public void SayHello() { Console.WriteLine("Hi Jie"); } public Object Clone() { return (Object)this.MemberwiseClone(); } }
大话设计模式里拷贝简历的例子(浅层拷贝,深层暂时不作了解)
namespace 原型模式 { class Program { static void Main(string[] args) { Resume r = new Resume("大鸟"); r.SetPersonInfo("男", "29"); r.SetWorkExperience("1909-2100", "微软公司"); r.Display(); Resume r2 = (Resume)r.Clone(); r2.Display(); r2.SetWorkExperience("2010-2011", "汕头公司"); r2.Display(); Console.ReadLine(); } } class WorkExpreience { 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 string timeArea; private string company; public Resume(string name) { this.name = name; } public void SetPersonInfo(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(); } } }