C#设计模式之五原型模式(Prototype Pattern)【创建型】
一、引言 2.4、模式的组成 ????? 可以看出,在原型模式的结构图有以下角色: ???? (1)、原型类(Prototype):原型类,声明一个Clone自身的接口; ? (2)、具体原型类(ConcretePrototype):实现一个Clone自身的操作。 ?? 在原型模式中,Prototype通常提供一个包含Clone方法的接口,具体的原型ConcretePrototype使用Clone方法完成对象的创建。 2.5 原型模式的具体实现 ????? 《大话西游之大圣娶亲》这部电影,没看过的人不多吧,里面有这样一个场景。牛魔王使用无敌牛虱大战至尊宝,至尊宝的应对之策就是,从脑后把下一撮猴毛,吹了口仙气,无数猴子猴孙现身,来大战牛魔王的无敌牛虱。至尊宝的猴子猴孙就是该原型模式的最好体现。至尊宝创建自己的一个副本,不用还要重新孕育五百年,然后出世,再学艺,最后来和老牛大战,估计黄花菜都凉了。他有3根救命猴毛,轻轻一吹,想要多少个自己就有多少个,方便,快捷。 ?? 1 /// <summary> 2 /// 原型设计模式,每个具体原型是一类对象的原始对象,通过每个原型对象克隆出来的对象也可以进行设置,在原型的基础之上丰富克隆出来的对象,所以要设计好抽象原型的接口 3 </summary> 4 namespace 设计模式之原型模式 5 { 6 7 客户类 8 9 class Customer 10 { 11 static void Main(string[] args) 12 { 13 Prototype xingZheSun = new XingZheSunPrototype(); 14 Prototype xingZheSun2 = xingZheSun.Clone(); 15 Prototype xingZheSun3 = xingZheSun.Clone(); 16 17 Prototype sunXingZhe = SunXingZhePrototype(); 18 Prototype sunXingZhe2 = sunXingZhe.Clone(); 19 Prototype sunXingZhe3 = sunXingZhe.Clone(); 20 Prototype sunXingZhe4 = 21 Prototype sunXingZhe5 = 22 23 //1号孙行者打妖怪 24 sunXingZhe.Fight(); 25 2号孙行者去化缘 26 sunXingZhe2.BegAlms(); 27 28 战斗和化缘也可以分类,比如化缘,可以分:水果类化缘,饭食类化缘;战斗可以分为:天界宠物下界成妖的战斗,自然修炼成妖的战斗,大家可以自己去想吧,原型模式还是很有用的 29 30 Console.Read(); 31 } 32 } 33 34 35 抽象原型,定义了原型本身所具有特征和动作,该类型就是至尊宝 36 37 public abstract Prototype 38 39 战斗--保护师傅 40 void Fight(); 41 化缘--不要饿着师傅 42 BegAlms(); 43 44 吹口仙气--变化一个自己出来 45 abstract Prototype Clone(); 46 47 48 49 具体原型,例如:行者孙,他只负责化斋饭食和与天界宠物下界的妖怪的战斗 50 51 sealed XingZheSunPrototype:Prototype 52 53 战斗--保护师傅--与自然修炼成妖的战斗 54 override Fight() 55 56 Console.WriteLine("腾云驾雾,各种武艺"); 57 58 化缘--不要饿着师傅--饭食类 59 BegAlms() 60 61 Console.WriteLine(什么都能要来62 63 64 65 override Prototype Clone() 66 67 return (XingZheSunPrototype)this.MemberwiseClone(); 68 69 70 71 72 具体原型,例如:孙行者,他只负责与自然界修炼成妖的战斗和化斋水果 73 74 SunXingZhePrototype : Prototype 75 76 战斗--保护师傅-与天界宠物战斗 77 78 79 Console.WriteLine(80 81 化缘--不要饿着师傅---水果类 82 83 84 Console.WriteLine(85 86 87 88 89 90 return (SunXingZhePrototype)91 92 93 }
System { [ComVisible(true)] interface ICloneable { object Clone(); } } 在Net的FCL里面实现ICloneable接口的类如图,自己可以去查看每个类自己的实现,在此就不贴出来了。 五、总结 ?????? 到今天为止,所有的创建型设计模式就写完了。学习设计模式应该是有一个循序渐进的过程,当我们写代码的时候不要一上来就用什么设计模式,而是通过重构来使用设计模式。创建型的设计模式写完了,我们就总结一下。Singleton单件模式解决的是实体对象个数的问题。除了Singleton之外,其他创建型模式解决的都是new所带来的耦合关系。 Factory Method,Abstract Factory,Builder都需要一个额外的工厂类来负责实例化“易变对象”,而Prototype则是通过原型(一个特殊的工厂类)来克隆“易变对象”。(其实原型就是一个特殊的工厂类,它只是把工厂和实体对象耦合在一起了)。如果遇到“易变类”,起初的设计通常从Factory Method开始,当遇到更多的复杂变化时,再考虑重构为其他三种工厂模式(Abstract Factory,Builder,Prototype)。 一般来说,如果可以使用Factory Method,那么一定可以使用Prototype。但是Prototype的使用情况一般是在类比较容易克隆的条件之上,如果是每个类实现比较简单,都可以只用实现MemberwiseClone,没有引用类型的深拷贝,那么就更适合了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |