1、前言
有时候会出现这样一个问题,细胞分裂,一般来说一个细胞就是一个类。分裂的时候我们只能new一个一个的出来,在这个数量相当大的情况下是不是感觉Crazy。咦,这时候你有必要了解一下原型模式。
2、定义
当程序中确定了所需要的通用类(细胞),但需要将具体类延迟到运行时才能确定,当你需要的类尽在他们的提供处理方式不一样的时候原型模式就是很好的选择。使用原型模式就不用new细胞类了我们可以通过克隆Clon来实现。克隆不是C#固有的属性但是这依旧不能阻止你玩成这样的操作。下面来看列子
/// <summary> /// kelong /// </summary> public abstract class CellsClon { public abstract object Clone(); } /// <summary> /// 细胞类 /// </summary> public class Cells:CellsClon { /// <summary> /// 姓名 /// </summary> public string ? Name { get; set; } /// <summary> /// 编码 /// </summary> public string? Code { get; set; }=Guid.NewGuid().ToString(); /// <summary> /// 克隆方法 /// </summary> /// <returns></returns> public override object Clone() { return this.MemberwiseClone() ; } //调用 Cells cc = new(); cc.Name = "红细胞——————————————————————"; var cc2 = cc.Clone() as Cells; Console.WriteLine(cc.Name+cc.Code); Console.WriteLine(cc2.Name+cc2.Code);
上面原型模式的运行结果为(从运行结果可以看出,创建的两个拷贝对象的Code属性都是与原型对象Code属性一样的)。上面代码实现的浅拷贝的方式,浅拷贝是指当对象的字段值被拷贝时,字段引用的对象不会被拷贝。例如,如果一个对象有一个指向字符串的字段,并且我们对该对象做了一个浅拷贝,那么这两个对象将引用同一个字符串,而深拷贝是对对象实例中字段引用的对象也进行拷贝,如果一个对象有一个指向字符串的字段,并且我们对该对象进行了深拷贝的话,那么我们将创建一个对象和一个新的字符串,新的对象将引用新的字符串。也就是说,执行深拷贝创建的新对象和原来对象不会共享任何东西,改变一个对象对另外一个对象没有任何影响,而执行浅拷贝创建的新对象与原来对象共享成员,改变一个对象,另外一个对象的成员也会改变。
原型模式的优点有:
- 原型模式向客户隐藏了创建新实例的复杂性
- 原型模式允许动态增加或较少产品类。
- 原型模式简化了实例的创建结构,工厂方法模式需要有一个与产品类等级结构相同的等级结构,而原型模式不需要这样。
- 产品类不需要事先确定产品的等级结构,因为原型模式适用于任何的等级结构
原型模式的缺点有:
- 每个类必须配备一个克隆方法
- 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。
PS:清晨的雨露拍打着花瓣的额头,不禁让人低下头轻嗅它的清香。远远望去,窗台的茉莉花又回到了属于它的往昔,花香弥漫,婀娜妖娆。城墙上参差的绿色也慢慢爬上了眉梢。