技术开发 频道

.Net设计模式之原型模式

  3.3深复制与浅复制

  如果仅仅从示例代码上看,实现原型模式并不困难。然而复杂的情况是,如果一个对象是复合对象或者包含其他的对象,那么克隆对象的问题是仅仅复制对象本身,还是连同被引用的对象一起复制?
 
  例如,我们在克隆一个楼盘时,希望获得关于这个楼盘的所有新的数据,以便于修改。这时在复制楼盘时,复制了楼盘对象及其包含的所有房间对象,并且隶属于新产生的楼盘。在这个操作中,房间的复制是间接进行的,这种情况是深复制。即除了引用其他对象的变量外,被复制对象的所有变量都含有与原对象相同的值,引用其他对象的变量将指向原有这些变量的复制品。
 
  有时我们不希望复制包含的对象,而是需要所复制对象中包含的对象仍然指向原来的引用。例如,克隆用户清单,其中包括了用户对象,而克隆的用户清单不需要复制所包含的用户对象。这样不管修改了哪个清单中的用户信息,都可以在另一个清单中得到反应,这种情况是浅复制。即被复制对象的所有变量都含有与原对象相同的值,换言之,所有引用其他对象的变量仍然指向原来引用的对象。
 
  .NET中的原型模式
 
  .NET中的很多类支持原型模式。例如我们希望获得一个与现有数据集结构相同的数据集,即可采用克隆的方法:Dim dsnew As DataSet=ds.Clone
 
  注意,与数据相关的类还有一个方法Copy。与克隆不同,该方法不仅复制对象的结构,还复制对象中包含的数据,例如,我们希望复制现有数据集的结构和数据,则采用该方法:Dsnew=ds.Copy
 
  使用Clone时,需要注意是深复制还是浅复制。.NET中实现IClone接口的类基本上都采用浅复制的策略,需要深复制的场合需要开发人员根据需要实现。
0
相关文章