Heim >Backend-Entwicklung >C#.Net-Tutorial >.NET-Prototypmodus erklärt

.NET-Prototypmodus erklärt

高洛峰
高洛峰Original
2016-12-10 09:20:291143Durchsuche

Definition des Prototypmusters:

Verwenden Sie Prototypinstanzen, um die zu erstellenden Objekttypen anzugeben, und erstellen Sie neue Objekte durch Kopieren dieser Prototypen.

Strukturdiagramm des Prototypmodus:

.NET-Prototypmodus erklärt

Ein spezieller Modus im Kreativmodus – der Prototypmodus. Eine der größten Funktionen besteht darin, dort ein vorhandenes Objekt zu klonen Es gibt zwei Ergebnisse dieses Klonens, eines ist eine flache Kopie und das andere ist eine tiefe Kopie.

Der Kreativmodus wird im Allgemeinen zum Erstellen eines neuen Objekts verwendet. Anschließend können wir mit diesem Objekt einige Objektoperationen ausführen, ohne dass eine spezielle new()-Operation erforderlich ist Schließen Sie die Erstellung von Objekten schnell ab. Dies ist zweifellos eine sehr effektive Möglichkeit, schnell ein neues Objekt zu erstellen.

1. Prototypmodus: Flache Kopie

Definieren Sie eine Schnittstelle, um alle Farbobjektschnittstellen auszudrücken

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

Gibt Der spezifische Implementierungscode von Rot:

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

Der spezifische Testcode lautet wie folgt:

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-Prototypmodus erklärt

Es kann festgestellt werden, dass es keine Auswirkung auf die Attributparameter der Farbe hat, wenn wir den roten Attributwert des Objekts color1 ändern, d. h. die Änderung Das Kopieren des Objekts hat keinen Einfluss auf den Status des Objekts selbst.

2. Prototyp-Modus: Deep Copy

Die bei Deep Copy betrachtete Situation ist relativ kompliziert, da zwischen Objekten Vererbungsbeziehungen oder Referenzbeziehungen bestehen können. Sie müssen dabei aufpassen Deep Copying kann im Allgemeinen eine einfache Deep Copy-Methode für Objekte verwenden, oder Sie können Objekte auch in Form einer Serialisierung kopieren. Das Prototypmuster wird in Form einer Serialisierung implementiert:

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

Serialisierungshilfsklasse:

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

Die laufenden Ergebnisse des Programms sind wie folgt:

.NET-Prototypmodus erklärt

Fazit: Durch Serialisierung und Deserialisierung entstehen neue Objekte. Solange im Projekt der Prototypmodus zum Kopieren von Objekten verwendet wird, kann ein tiefes Kopieren in Form einer Serialisierung durchgeführt werden.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn