坚持一天 只是写了模式大致的介绍,不然太多了有点不好了?!洞蠡吧杓颇J健肥潜竞檬橛础?/p>
「1」说明
此乃《设计模式》之原型模式
「2」原型模式定义
原型模式(prototype),用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
原型模式其实就是从一个对象在创建另外一个可定制的对象,而且不需知道任何创建的细节。
「3」原型模式(Prototype)结构图
- Client:客户端调用Prototype的Clone接口。
- Prototype:原型类,声明了克隆自身的clone接口
- CocreteProduct1:具体原型类1,实现clone接口创建新的CocreteProduct1对象
- CocreteProduct2:具体原型类1,实现clone接口创建新的CocreteProduct2对象
「4」什么时候使用建造者模式和它好处
- 当需要多次实例化对象的时候,可以考虑用原型模式。
- 实例化对象时,都需要执行一次构造函数,如果构造函数的执行时间长,那么多次的执行这个初始化 操作实在是太低效了。一般在初始化的信息不发生变化的情况下克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高,何乐而不为呢?
「5」原型模式基本代码推演
- Prototype原型类
abstract class Prototype
{
private string id;
public Prototype(string id)
{
this.id = id;
}
public string Id
{
get {return id};
}
public abstract Prototype Clone(); //抽象类关键就是有这样一个方法
}
- 具体原型类
class ConceretePrototype1 : Prototype
{
public ConcretePrototype1(string id) : base(id)
{
}
public override Prototype Clone()
{
return (Prototype)this.MemberwiseClone();
}
}
- 客户端代码
static void Main(string[] args)
{
ConcretePrototype1 p1 = new ConcretePrototype1("I");
ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();
Console.Read();
}
原型模式等于不用重新初始化对象,而是动态地获得对象运行时的状态。
「6」深拷贝和浅拷贝
MemberwiseCLonef方法是这样,如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型的,则复制引用但不复制引用的对象;因此,原始对象及其副本引用同一对象。
在一些特定的场合,会经常涉及深拷贝和浅拷贝,比如说,数据集对象DataSet,它就有Clone()方法和Copy方法,Clone方法用来复制DataSet的结构,但不复制DataSet的数据,实现了原型模式的浅拷贝。Copy方法不但复制结构,也复制数据,其实就是实现了原型模式的深复制。