using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _1.创建者模式_原型模式//浅克隆
{
//用一个已经创建的实例作为原型,通过对原型对象复制,产生一个和原型相同或相似的新对象。
//关注的是大量相同或相似对象的创建问题。
//1、抽象原型类(Prototype):声明一个具体对象必须实现的,克隆自身的接口,通常名为Clone();
//2、具体原型类(Concrete Prototype):需要实现抽象原型类的Clone方法,包含深拷贝和浅拷贝。它是可被克隆的对象
//浅克隆:克隆的新对象属性与原对象完全相同(非基本类型属性,也指向原对象指向的内存地址)
//C#中的MemberwiseClone属于浅克隆。
//深克隆:克隆的新对象属性与原对象完全相同(属性中引用的其他对象也会克隆,不再指向原有对象内存地址)
//除了对象本身被复制外,对象所包含的所有成员变量也将被复制。
//3、访问类:使用具体原型类的clone方法来复制新的对象。
// 抽象原型类颜色接口
public interface IColor
{
IColor Clone();
int Red { get; set; }
int Green { get; set; }
int Blue { get; set; }
}
public class IdInfo
{
public string IdNumber;
public IdInfo(string IdNumber)
{
this.IdNumber = IdNumber;
}
}
//给出具体原型类
public class Color : IColor
{
public int Red { get; set; }
public int Green { get; set; }
public int Blue { get; set; }
//浅克隆方法
public IColor Clone()
{
return (IColor)this.MemberwiseClone();
}
}
class program
{
static void Main(string[] args)
{
//实例化克隆
IColor color = new Color();
color.Red = 255;
color.Green = 200;
Console.WriteLine("color -red " + color.Red); //255
Console.WriteLine("color -Green " + color.Green);//200
IColor color1 = color.Clone();//再次克隆
Console.WriteLine("color1-red " + color1.Red);//255
Console.WriteLine("color -Green " + color1.Green);//200
color.Red = 224;//赋值新克隆对象,改变属性,但不会改变原对象的属性
Console.WriteLine("color -red " + color.Red); //224
Console.WriteLine("color1-red " + color1.Red);//255
Console.ReadKey();
}
}
深克隆
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace _1.创建者模式_原型模式_深克隆
{
// 抽象原型类颜色接口
public interface IColor
{
IColor DeepClone();
int Red { get; set; }
int Green { get; set; }
int Blue { get; set; }
}
//给出具体原型类
[Serializable]
public class Color : IColor
{
public int Red { get; set; }
public int Green { get; set; }
public int Blue { get; set; }
//利用xml序列化和反序列化实现
public virtual IColor DeepClone()
{
MemoryStream memoryStream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(memoryStream, this);
memoryStream.Position = 0;
return (IColor)formatter.Deserialize(memoryStream);
}
}
class program
{
static void Main(string[] args)
{
//实例化克隆
IColor color = new Color();
color.Red = 255;
Console.WriteLine("color -red " + color.Red); //255
IColor color1 = color.DeepClone();//再次克隆
Console.WriteLine("color1-red " + color1.Red);//255
color.Red = 224;//赋值新克隆对象,改变属性,但不会改变原对象的属性
Console.WriteLine("color -red " + color.Red); //224,对象副本的修改不会影响对象本身的状态
IColor color2 = color1.DeepClone();//再次克隆
Console.WriteLine("color1-red " + color2.Red);//224
Console.ReadKey();
}
}
}