今天来说说设计模式中的原型模式:
应用原型模式就是建立一个原型,然后通过对原型来进行复制的方法,来产生一个和原型相同或相似的新对象,或者说用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。如果我们需要大量的创建一个相同的对象的时候,可以采用原型模式。原型模式有浅拷贝和深拷贝。浅拷贝很简单下面我们来放上浅拷贝的代码
public interface IColor
{
IColor clone();
int Red { get; set; }
int Green { get; set; }
int Bule { get; set; }
}
public class RedColor : IColor
{
public int Red { get ; set; }
public int Green { get; set; }
public int Bule { get; set; }
public IColor clone()
{
return (IColor)this.MemberwiseClone();
}
}
public class Client
{
public void Test()
{
IColor color = new RedColor();
color.Red = 255;
Console.WriteLine("color red " + color.Red);
IColor color1 = color.clone();
color1.Red = 256;//值类型
Console.WriteLine("color1 red " + color1.Red);
Console.WriteLine("color red " + color.Red);
Console.ReadKey();
}
}
因为是值类型,所以改变克隆后对象的属性不会影响到其本身。接下来说下利用序列化和反序列化实现深拷贝的原型模式。
关于深拷贝浅拷贝https://blog.csdn.net/heyangyi_19940703/article/details/51241081可以看看这篇文章。
public interface IColor
{
IColor clone();
int Red { get; set; }
int Green { get; set; }
int Bule { get; set; }
Test Test { get; set; }
}
[Serializable]
public class RedColor : IColor
{
public int Red { get ; set; }
public int Green { get; set; }
public int Bule { get; set; }
public Test Test { get; set; }
public IColor clone()
{
SerializableHelp serializableHelp = new SerializableHelp();
string target = serializableHelp.Serializeable(this);
return serializableHelp.Derializable<IColor>(target);
}
//public IColor clone()
//{
// return (IColor)this.MemberwiseClone();
//}
}
[Serializable]
public class Test
{
public string name { get; set; }
}
public class Client
{
public void Test()
{
IColor color = new RedColor();
color.Red = 255;
color.Test = new Test() { name = "Test1" };
Console.WriteLine("color red " + color.Red);
Console.WriteLine("color TestName " + color.Test.name);
IColor color1 = color.clone();
color1.Red = 256;//值类型
color1.Test.name = "Test2";
Console.WriteLine("color1 red " + color1.Red);
Console.WriteLine("color1 TestName " + color1.Test.name);
Console.WriteLine("color TestName " + color.Test.name);
Console.ReadKey();
}
}
public class SerializableHelp
{
public string Serializeable(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);
}
}
以上就是通过序列化和反序列化实现的深拷贝。可以尝试把去掉注释的部分,再将上述的克隆方法去掉,比较下浅拷贝看看他们的输出有什么区别