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:
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 }
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:
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.