C#设计模式之十一享元模式(Flyweight Pattern)【结构型】
一、引言 2.4、模式的组成 ?? ? ??? (1)、抽象享元角色(Flyweight):此角色是所有的具体享元类的基类,为这些类规定出需要实现的公共接口。那些需要外部状态的操作可以通过调用方法以参数形式传入。 ??? (2)、具体享元角色(ConcreteFlyweight):实现抽象享元角色所规定的接口。如果有内部状态的话,可以在类内部定义。 ??? (3)、享元工厂角色(FlyweightFactory):本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享,当一个客户端对象调用一个享元对象的时候,享元工厂角色检查系统中是否已经有一个符合要求的享元对象,如果已经存在,享元工厂角色就提供已存在的享元对象,如果系统中没有一个符合的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。 ??? (4)、客户端角色(Client):本角色需要存储所有享元对象的外部状态。 2.5、享元模式的具体代码实现 ??? 说起“享元模式”,我这里有一个很好的场景可以进行说明。我们知道在战斗的游戏场景中,会有很多战士,基本上战士都是差不多的,小区别战士忽略,最大的区别就是拿的武器不同而已。在大型的战争游戏中,会有大量的士兵出来战斗,我们写程序的时候就可以用“享元”来解决大量战士的情况。 1 namespace 享元模式的实现 2 { 3 /// <summary> 4 /// 享元模式不是很难,但是有些状态需要单独处理,以下就是该模式的C#实现,有些辅助类,大家应该看得出吧,别混了。 5 </summary> 6 class Client 7 { 8 static void Main(string[] args) 9 { 10 //比如,我们现在需要10000个一般士兵,只需这样 11 SoldierFactory factory = new SoldierFactory(); 12 AK47 ak47 = AK47(); 13 for (int i = 0; i < 100; i++) 14 { 15 Soldier soldier = null; 16 if (i <= 20 17 { 18 soldier = factory.GetSoldier("士兵" + (i + 1),ak47,SoldierType.Normal); 19 } 20 else 21 22 soldier = factory.GetSoldier( 23 } 24 soldier.Fight(); 25 } 26 我们有这么多的士兵,但是使用的内存不是很多,因为我们缓存了。 27 Console.Read(); 28 } 29 } 30 31 这些是辅助类型 32 public enum SoldierType 33 34 Normal, 35 Water 36 37 38 该类型就是抽象战士Soldier--该类型相当于抽象享元角色 39 abstract Soldier 40 41 通过构造函数初始化士兵的名称 42 protected Soldier( name) 43 44 this.Name = name; 45 46 47 士兵的名字 48 string Name { get; private set; } 49 50 可以传入不同的武器就用不同的活力---该方法相当于抽象Flyweight的Operation方法 51 void Fight(); 52 53 public Weapen WeapenInstance { 54 55 56 一般类型的战士,武器就是步枪---相当于具体的Flyweight角色 57 sealed NormalSoldier : Soldier 58 59 60 public NormalSoldier(string name) : base(name) { } 61 62 执行享元的方法---就是Flyweight类型的Operation方法 63 override Fight() 64 65 WeapenInstance.Fire(士兵:"+Name+ 在陆地执行击毙任务"); 66 67 68 69 这是海军陆战队队员,武器精良----相当于具体的Flyweight角色 70 WaterSoldier : Soldier 71 72 73 public WaterSoldier( 74 75 76 77 78 WeapenInstance.Fire( 在海中执行击毙任务 79 80 81 82 此类型和享元没太大关系,可以算是享元对象的状态吧,需要从外部定义 83 Weapen 84 85 void Fire( jobName); 86 87 88 89 AK47:Weapen 90 91 jobName) 92 93 Console.WriteLine(jobName); 94 95 96 97 该类型相当于是享元的工厂---相当于FlyweightFactory类型 98 SoldierFactory 99 100 static IList<Soldier> soldiers; 101 102 static SoldierFactory() 103 104 soldiers = new List<Soldier>(); 105 106 107 Soldier mySoldier = 108 因为我这里有两种士兵,所以在这里可以增加另外一个参数,士兵类型,原模式里面没有, 109 public Soldier GetSoldier( name,Weapen weapen,SoldierType soldierType) 110 111 foreach (Soldier soldier in soldiers) 112 113 if (string.Compare(soldier.Name,name,true) == 0114 115 mySoldier = soldier; 116 return mySoldier; 117 118 119 我们这里就任务名称是唯一的 120 if (soldierType == SoldierType.Normal) 121 122 mySoldier = NormalSoldier(name); 123 124 125 126 mySoldier = WaterSoldier(name); 127 128 mySoldier.WeapenInstance = weapen; 129 130 soldiers.Add(mySoldier); 131 132 133 134 }
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |