您的位置:首页 > 其它

设计模式之原型模式(Prototype)

2014-03-05 16:53 239 查看
1、出现原因

在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口

如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离出“这些易变对象” ,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变

2、意图:

使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。(将相同的部分进行赋值拷贝,不同的部分需要客户端自己决定)

3、结构图

Worker worker = new Worker()
{
Name = "小明",
Age = 23,
WorkExprien = new WorkExperience() { CompanyName="百度",Time=2}
};

Worker w1 = worker.QianClone();//浅拷贝
Worker w2 = (Worker)worker.Clone();//深拷贝
Worker w3 = worker.ShenClone();//序列化版本的深拷贝
Console.WriteLine(worker.WorkExprien.Equals(w1.WorkExprien));//True
Console.WriteLine(worker.WorkExprien.Equals(w2.WorkExprien));//False
Console.WriteLine(worker.WorkExprien.Equals(w3.WorkExprien));//False


测试代码

[b]6、.Net中的原型模式[/b]

1》就是上面提到的ICloneable接口

2》DataSet

Clone()方法:浅拷贝:只复制表的结构,不复制表的数据

Copy()方法:深拷贝:既复制表的结构,又复制表的数据

7、实现要点

1、产品的创建和初始化类的Clone方法中完成

2、浅复制与深复制的区别

3、需要深复制的场合需要开发人员根据需要实现(在重写的 Clone 里 将引用类型 成员进行复制)

4、有些情况下Clone功能不容易实现,特别是遇到对象的循环引用时(例如:A关联B,同时B也关联A:就是A中有B,同时B中也有A。这样就会造成,A中的Clone克隆的时候,要将 B进行克隆,同时在 B的Clone里面进行 克隆的时候A也就被同时复制了,所以会一直循环复制下去)

8、效果

运行时增加或删除产品:只要通过客户原型实例即可将新产品类型增加到系统中,例如组态软件中工具箱中的每个工具可以对应一个注册的原型对象,可以通过增加原形对象扩展工具箱。

容易地创建复杂的对象:在图形编辑和组态等软件中,经常需要创建复杂的图元。这些图元是由简单图元组成的,采用原型模式可以很容易地将复杂图元作为一般图元来使用,使软件的工具箱具有自扩展功能

9、适用性:

1、当一个系统应该独立于产品的创建、构成和表示时,可以使用原型模式。

2、在使用时,我们可以用一些原型对象代替生成相应对象的工厂对象,并且可以使拷贝、粘贴等操作独立于需要复制的对象

10、总结

1、Prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系(使用者不用关心,类内部的具体情况,直接复制就可以了),它同样要求这些“易变类”拥有“稳定的接口”。

2、Prototype模式对于“如何创建易变类的实体对象”采用“原型克隆”的方法来做,它使得我们可以非常灵活地动态创建“拥有某些稳定接口”的新对象——所需工作仅仅是注册一个新的对象(即原型)(只要已经创建一个就可以了),然后在任何需要的地方不断地Clone。

3、Prototype模式中的Clone方法可以利用.NET中的Object类的MemberwiseClone()方法(浅拷贝)或者序列化来实现深拷贝。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: