Gof定义
使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。
动机
在软件系统中,经常面临着“某些结构复杂的对象”的创建工作,但由于需求的变化,这些对象将成面临着剧烈的变化,但他们拥有比较稳定一致的接口。
原型模式(Prototype)的几个要点
- Prototype模式同样用于隔离类对象的使用者和具体类型(易变类型)之间的耦合关系,同样要求这些易变类型具有稳定的接口。
- Prototype模式对于“如何创建易变类的实体对象”采用原型克隆的方法来做,他使得我们可以非常灵活的动态创建“拥有某些稳定接口”的新对象–所需工作仅仅是注册一个新类的对象(原型),然后在任何需要的地方不断地Clone。
- Prototype模式中的克隆方法可以利用Net中的Object类的MemberwiseClone方法或是序列化来实现深拷贝。
最基本的实现代码 (通过this.MemberwiseClose来实现拷贝)
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来改进上面最基本的代码
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();
}
}
}
自己写的一个简单例子:
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();
}
}
}
我的博客园原文网址:http://www.cnblogs.com/cxeye/archive/2012/09/02/2667759.html