原来创建的对象值不会改变 Person p2 = p.Clone() as Person;Person p3 = Ser

时间:2021-11-26 02:50:29

原型模式其实C# Object中已经供给了一个Clone( )要领,平时很少用到,比来读Retrofit源码时候看到有这种使用方法。

界说

原型模式就是在系统clone()符号的根本上,对Clone()进行复写,差此外操纵可以孕育产生两种拷贝模式。

例子一场景 是个java的, 只是介绍使用的场景

UML类图

原来创建的对象值不会改变 Person p2 = p.Clone() as Person;Person p3 = Ser

今天我们来讲原型模式,这个模式的简单水平是仅次于单例模式和迭代器模式,非常简单,但是要使 
用好这个模式还有很多注意事项。我们通过一个例子来解释一下什么是原型模式。 
此刻电子账单越来越风行了,好比你的信用卡,到月初的时候银行就会发一份电子邮件到你邮箱中, 
说你这个月消费了几多,什么时候消费的,积分是几多等等,这个是每个月发一次,但是还有一种也是银 
行发的邮件你必定有印象:告白信,此刻各大银行的信用卡部门都在撮合客户,电子邮件是一种廉价、快 
捷的通讯方法,你用纸质的告白信阿谁用度多高呀,好比我今天推出一个信用卡刷卡抽奖勾当,通过电子 
账单系统可以一个晚上发送给 600 万客户,为什么要用电子账单系统呢?直接找个发垃圾邮件不就解决问 
题了吗?是个好主意,但是这个方案在金融行业是行欠亨的,银行发这种邮件是有要求的,一是一般银行 
都要求本性化处事,发过去的邮件上总有一些小我私家信息吧,好比“XX 先生”,“XX 女士”等等,二是邮件的 
达到率有必然的要求,由于多量量的发送邮件会被接收方邮件处事器误认是垃圾邮件,因此在邮件头要增 
加一些伪造数据,以规避被反垃圾邮件引擎误认为是垃圾邮件;从这两方面考虑告白信的发送也是电子账单系统(电子账单系统一般包孕:账单分析、账单生成器、告白信打点、发送行列队伍打点、发送机、退信处 
理、报表打点等)的一个子成果,我们今天就来考虑一下告白信这个模块是怎么开发的。那既然是告白信, 
必定需要一个模版,然后再从数据库中把客户的信息一个一个的取出,放到模版中生成一份完整的邮件, 
然后扔给发送机进行发送措置惩罚惩罚,我们来看类图: 

原来创建的对象值不会改变 Person p2 = p.Clone() as Person;Person p3 = Ser

例子1孙悟空的浅复制

///火影忍者中鸣人的影两全和孙悟空的的变都是原型模式 class Client { static void Main(string[] args) { // 孙悟空 原型 MonkeyKingPrototype prototypeMonkeyKing = new ConcretePrototype("MonkeyKing"); // 变一个 MonkeyKingPrototype cloneMonkeyKing = prototypeMonkeyKing.Clone() as ConcretePrototype; Console.WriteLine("Cloned1:\t"+cloneMonkeyKing.Id); // 变两个 MonkeyKingPrototype cloneMonkeyKing2 = prototypeMonkeyKing.Clone() as ConcretePrototype; Console.WriteLine("Cloned2:\t" + cloneMonkeyKing2.Id); Console.ReadLine(); } } /// <summary> /// 孙悟空原型 /// </summary> public abstract class MonkeyKingPrototype { public string Id { get; set; } public MonkeyKingPrototype(string id) { this.Id = id; } // 克隆要领,即孙大圣说“变” public abstract MonkeyKingPrototype Clone(); } /// <summary> /// 创建具体原型 /// </summary> public class ConcretePrototype : MonkeyKingPrototype { public ConcretePrototype(string id) : base(id) { } /// <summary> /// 浅拷贝 /// </summary> /// <returns></returns> public override MonkeyKingPrototype Clone() { // 挪用MemberwiseClone要领实现的是浅拷贝,此外还有深拷贝 return (MonkeyKingPrototype)this.MemberwiseClone(); } }

上面原型模式的运行功效为(从运行功效可以看出,创建的两个拷贝东西的ID属性都是与原型东西ID属性一样的):