如果状态数值也相同就没意义了

时间:2022-06-13 06:44:57

原文:C#设计模式之五原型模式(Prototype Pattern)【创建型】

一、引言

      在开始今天的文章之前先说明一点,欢迎大家来斧正。很多人说原型设计模式会节省机器内存,他们说是拷贝出来的东西,这些东西其实都是原型的复制,不会使用内存。我认为这是不同错误的,因为拷贝出来的每一个东西都是实际存在的,每个东西都有本身的独立内存地点,城市被GC回收。如果就浅拷贝来说,可能会公用一些字段,深拷贝是不会的,所以说原型设计模式会提高内存使用率,不必然。具体还要看其时的设计,如果拷贝出来的东西缓存了,每次使用的是缓存的拷贝东西,那就另当别论了,再说该模式自己解决的不是内存使用率的问题。
     此刻说说原型模式的要解决的问题吧,在软件系统中,当创建一个类的实例的过程很昂贵或很庞大,并且我们需要创建多个这样类的实例时,如果我们用new操纵符去创建这样的类实例,这就会增加创建类的庞大度和创建过程与客户代码庞大的耦合度。如果给与工厂模式来创建这样的实例东西的话,跟着产品类的不停增加,导致子类的数量不停增多,也导致了相应工厂类的增加,维护的代码维度增加了,因为有产品和工厂两个维度了,反而增加了系统庞大水平,所以在这里使用工厂模式来封装类创建过程并不同适。由于每个类实例都是不异的,这个不异指的是类型不异,但是每个实例的状态参数会有差别,如果状态数值也不异就没意义了,有一个这样的东西就可以了。当我们需要多个不异的类实例时,可以通过对本来东西拷贝一份来完成创建,这个思路正是原型模式的实现方法。

二、原型模式的详细介绍

2.1、动机(Motivate)

        在软件系统中,经常面临着“某些布局庞大的东西”的创建事情;由于需求的变革,这些东西经常面临着剧烈的变革,但是它们却拥有对照不变一致的接口。如何应对这种变革?如何向“客户措施(使用这些东西的措施)”断绝出“这些易变东西”,从而使得“依赖这些易变东西的客户措施”不跟着需求转变而转变?

2.2、意图(Intent)

      使用原型实例指定创建东西的种类,然后通过拷贝这些原型来创建新的东西。                 --《设计模式》Gof

2.3、布局图(Structure)

     

如果状态数值也相同就没意义了



2.4、模式的构成

      可以看出,在原型模式的布局图有以下角色:

     (1)、原型类(Prototype):原型类,声明一个Clone自身的接口;

   (2)、具体原型类(ConcretePrototype):实现一个Clone自身的操纵。

    在原型模式中,Prototype凡是供给一个包罗Clone要领的接口,具体的原型ConcretePrototype使用Clone要领完成东西的创建。

2.5 原型模式的具体实现

      《谎话西游之大圣娶亲》这部影戏,没看过的人不久不多吧,里面有这样一个场景。牛魔王使用无敌牛虱大战至尊宝,至尊宝的应对之策就是,从脑后把下一撮猴毛,吹了口仙气,无数猴子猴孙现身,来大战牛魔王的无敌牛虱。至尊宝的猴子猴孙就是该原型模式的最好浮现。至尊宝创建本身的一个副本,不用还要从头孕育五百年,然后出生避世,再学艺,最后来和老牛大战,,预计黄花菜都凉了。他有3根救命猴毛,轻轻一吹,想要几多个本身就有几多个,便利,快捷。
  

1 /// <summary> 2 /// 原型设计模式,每个具体原型是一类东西的原始东西,通过每个原型东西克隆出来的东西也可以进行设置,在原型的根本之上丰富克隆出来的东西,所以要设计好抽象原型的接口 3 /// </summary> 4 namespace 设计模式之原型模式 5 { 6 /// <summary> 7 /// 客户类 8 /// </summary> 9 class Customer 10 { 11 static void Main(string[] args) 12 { 13 Prototype xingZheSun = new XingZheSunPrototype().Clone(); 14 Prototype xingZheSun2 = new XingZheSunPrototype().Clone(); 15 Prototype xingZheSun3 = new XingZheSunPrototype().Clone(); 16 17 Prototype sunXingZhe = new SunXingZhePrototype().Clone(); 18 Prototype sunXingZhe2 = new SunXingZhePrototype().Clone(); 19 Prototype sunXingZhe3 = new SunXingZhePrototype().Clone(); 20 Prototype sunXingZhe4 = new SunXingZhePrototype().Clone(); 21 Prototype sunXingZhe5 = new SunXingZhePrototype().Clone(); 22 23 //1号孙行者打妖怪 24 sunXingZhe.Fight(); 25 //2号孙行者去化缘 26 sunXingZhe2.BegAlms(); 27 28 //战斗和化缘也可以分类,好比化缘,可以分:水果类化缘,饭食类化缘;战斗可以分为:天界宠物下界成妖的战斗,自然修炼成妖的战斗,大家可以本身去想吧,原型模式还是很有用的 29 30 Console.Read(); 31 } 32 } 33 34 /// <summary> 35 /// 抽象原型,界说了原型自己所具有特征和行动,该类型就是至尊宝 36 /// </summary> 37 public abstract class Prototype 38 { 39 // 战斗--掩护师傅 40 public abstract void Fight(); 41 // 化缘--不要饿着师傅 42 public abstract void BegAlms(); 43 44 // 吹口仙气--变革一个本身出来 45 public abstract Prototype Clone(); 46 } 47 48 /// <summary> 49 /// 具体原型,例如:行者孙,他只卖力化斋饭食和与天界宠物下界的妖怪的战斗 50 /// </summary> 51 public sealed class XingZheSunPrototype:Prototype 52 { 53 // 战斗--掩护师傅--与自然修炼成妖的战斗 54 public override void Fight() 55 { 56 Console.WriteLine("腾云驾雾,各类武艺"); 57 } 58 // 化缘--不要饿着师傅--饭食类 59 public override void BegAlms() 60 { 61 Console.WriteLine("什么都能要来"); 62 } 63 64 // 吹口仙气--变革一个本身出来 65 public override Prototype Clone() 66 { 67 return (XingZheSunPrototype)this.MemberwiseClone(); 68 } 69 } 70 71 /// <summary> 72 /// 具体原型,例如:孙行者,他只卖力与自然界修炼成妖的战斗和化斋水果 73 /// </summary> 74 public sealed class SunXingZhePrototype : Prototype 75 { 76 // 战斗--掩护师傅-与天界宠物战斗 77 public override void Fight() 78 { 79 Console.WriteLine("腾云驾雾,各类武艺"); 80 } 81 // 化缘--不要饿着师傅---水果类 82 public override void BegAlms() 83 { 84 Console.WriteLine("什么都能要来"); 85 } 86 87 // 吹口仙气--变革一个本身出来 88 public override Prototype Clone() 89 { 90 return (SunXingZhePrototype)this.MemberwiseClone(); 91 } 92 } 93 }