视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
.NET原型模式讲解
2020-11-27 22:36:20 责编:小采
文档


原型模式的定义:

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

原型模式结构图:

创建型模式中一个比较特殊的模式-原型模式,有个最大的特点是克隆一个现有的对象,这个克隆的结果有2种,一种是浅度复制,另一种是深度复制。

创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象。

1.原型模式:浅度复制

定义一个接口, 用来表述所有的颜色对象接口

 /// <summary>
 /// 颜色接口
 /// </summary>
 public interface IColor
 {
 IColor Clone();
 int Red { get; set; }
 int Green { get; set; }
 int Blue { get; set; }
 }

给出红色的具体实现代码:

 public class RedColor:IColor
 {
 public int Red { get; set; }
 public int Green { get; set; }
 public int Blue { get; set; }

 public IColor Clone()
 {
 return (IColor)this.MemberwiseClone(); 
 } 
 }

具体的测试代码如下:

 static void Main(string[] args)
 {
 IColor color = new RedColor();
 color.Red = 255;
 Console.WriteLine("color -red " + color.Red); //225
 IColor color1 = color.Clone();
 color1.Red = 224;
 Console.WriteLine("color1-red " + color1.Red);//224
 Console.WriteLine("color -red " + color.Red); //225
 }

可以发现:在我们修改color1对象的Red属性值,没有对color的属性参生影响,即对象副本的修改不会影响对象本身的状态。

2.原型模式:深度复制

深复制考虑的情况相对来说就会比较复杂,因为有可能对象是之间有继承关系或者引用关系的时候,可能我们深复制的时候就需要注意.一般来说深复制一方面可以采用种简单的深复制对象的时候的方案,还可以通过序列化的形式来进行对象的复制。下面通过序列化的形式来实现原型模式:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication4
{
 /// <summary>
 /// 颜色接口
 /// </summary>
 public interface IColor
 {
 IColorDemo Clone();

 int Red { get; set; }
 int Green { get; set; }
 int Blue { get; set; }
 Factroy f{get;set;}
 }

 /// <summary>
 /// 生产颜色的工厂信息
 /// </summary>
 [Serializable]
 public class Factroy
 {
 public string name { get; set; }
 }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication4
{
 /// <summary>
 /// 颜色
 /// </summary>
 [Serializable]
 public class RedColor:IColor
 {
 public int Red { get; set; }
 public int Green { get; set; }
 public int Blue { get; set; }
 public Factroy f { get; set; }

 public IColor Clone()
 {
 SerializableHelper s = new SerializableHelper();
 string target = s.Serializable(this);
 return s.Derializable<IColor>(target); 
 } 
 }
}

序列化帮助类:

/// <summary>
 /// 序列化和反序列化辅助类
 /// </summary>
 public class SerializableHelper
 {
 public string Serializable(object target)
 {
 using (MemoryStream stream = new MemoryStream())
 {
 new BinaryFormatter().Serialize(stream, target);

 return Convert.ToBaseString(stream.ToArray());
 }
 }

 public object Derializable(string target)
 {
 byte[] targetArray = Convert.FromBaseString(target);

 using (MemoryStream stream = new MemoryStream(targetArray))
 {
 return new BinaryFormatter().Deserialize(stream);
 }
 }

 public T Derializable<T>(string target)
 {
 return (T)Derializable(target);
 }
 }

测试:

 static void Main(string[] args)
 {
 IColor color = new RedColor();
 color.Red = 255;
 color.f = new Factroy() { name="湖北工厂" };
 Console.WriteLine("color - Factroy:" + color.f.name); //湖北工厂

 IColor color1 = color.Clone();
 color1.Red = 234;
 color1.f.name = "北京工厂";
 Console.WriteLine("color1- Factroy:" + color1.f.name); //北京工厂
 Console.WriteLine("color - Factroy:" + color.f.name); //湖北工厂
 Console.Read();
 }

程序的运行结果如下:


结论:通过序列化和反序列化形成新的对象。其实只要是项目中要使用原型模式进行对象复制的情况下,都可以通过序列化的形式来进行深复制。

下载本文
显示全文
专题