Home  >  Article  >  Backend Development  >  .NET prototype mode explained

.NET prototype mode explained

高洛峰
高洛峰Original
2016-12-10 09:20:291114browse

Definition of prototype pattern:

Use prototype instances to specify the types of objects to be created, and create new objects by copying these prototypes.

Prototype mode structure diagram:

.NET prototype mode explained

A special mode in the creation mode - prototype mode. One of its biggest features is to clone an existing object. There are two results of this cloning, one is shallow Degree copy, the other is deep copy.

Creative mode is generally used to create a new object, and then we use this object to complete some object operations. We can quickly create an object through the prototype mode without providing a special new() operation to complete it quickly. Object creation is undoubtedly a very effective way to quickly create a new object.

1. Prototype mode: Shallow copy

Define an interface to express all color object interfaces

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

Gives the specific implementation code of red:

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();
  }
}

Specific test code As follows:

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
}

.NET prototype mode explained

It can be found that when we modify the Red attribute value of the color1 object, there is no impact on the color attribute, that is, the modification of the object copy will not affect the state of the object itself.

2. Prototype mode: deep copy

The situation considered in deep copy is relatively complicated, because there may be inheritance relationships or reference relationships between objects, and we may need to pay attention when deep copying. Generally speaking, deep copying can use a simple deep copying scheme on the one hand, and the object can also be copied in the form of serialization on the other. The prototype mode is implemented in the form of serialization below:

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);
    }
  }
}

Serialization helper class:

/// <summary>
  /// 序列化和反序列化辅助类
  /// </summary>
  public class SerializableHelper
  {
    public string Serializable(object target)
    {
      using (MemoryStream stream = new MemoryStream())
      {
        new BinaryFormatter().Serialize(stream, target);
 
        return Convert.ToBase64String(stream.ToArray());
      }
    }
 
    public object Derializable(string target)
    {
      byte[] targetArray = Convert.FromBase64String(target);
 
      using (MemoryStream stream = new MemoryStream(targetArray))
      {
        return new BinaryFormatter().Deserialize(stream);
      }
    }
 
    public T Derializable<T>(string target)
    {
      return (T)Derializable(target);
    }
  }

Test:

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();
}

The running results of the program are as follows:

.NET prototype mode explained

Conclusion: New objects are formed through serialization and deserialization. In fact, as long as the prototype mode is used for object copying in the project, deep copying can be performed in the form of serialization.

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn