.NET prototype mode explained

高洛峰
Release: 2016-12-20 13:07:01
Original
1119 people have browsed it

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; }
}
Copy after login

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

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
}
Copy after login

.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);
    }
  }
}
Copy after login

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);
    }
  }
Copy after login

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

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.

The above is the entire content of this article. I hope it will be helpful to everyone’s learning. I also hope that everyone will visit the PHP Chinese website.


Related labels:
source:php.cn
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template