一.介绍
享元模式(Flyweight Pattern)。属于结构型模式。运用共享技术有效地支持大量细粒度的对象。
二.实现
当我们需要重复使用一个对象的时候,如果重复创建对象,会让内存消耗越来越大。能不能创建了第一次之后,如果需要再次使用,再直接使用之前已经创建的对象呢。让一个对象可以共享,享元模式就是实现这样的功能。
//抽象享元角色 public abstract class Flyweight {
//参数是享元的外部状态,随环境变化而变化 public abstract void Operation(int extrinsicState); } //具体享元角色 public class ConcreteFlyweightA : Flyweight { public override void Operation(int extrinsicState) { Console.WriteLine("ConcreteFlyweightA" + extrinsicState); } } public class ConcreteFlyweightB : Flyweight { public override void Operation(int extrinsicState) { Console.WriteLine("ConcreteFlyweightB" + extrinsicState); } } //享元工厂角色 public class FlyweightFactory {
//享元内部状态,不随环境变化而变化 private Hashtable flyweights = new Hashtable(); public FlyweightFactory() { flyweights.Add("A", new ConcreteFlyweightA()); flyweights.Add("B", new ConcreteFlyweightA()); } public Flyweight GetFlyweight(string intrinsicState) { if (flyweights.ContainsKey(intrinsicState)) { return flyweights[intrinsicState] as Flyweight; } return null; } } public static void Main(string[] args) { //初始化享元工厂 var factory = new FlyweightFactory(); //判断工厂是否有A,有的话可以直接使用 var flyweight1 = factory.GetFlyweight("A"); if (flyweight1 != null) { flyweight1.Operation(1); } //判断工厂是否有B,有的话可以直接使用 var flyweight2 = factory.GetFlyweight("B"); if (flyweight2 != null) { flyweight2.Operation(1); } }
三.总结
优点:
1.降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的压力。
缺点:
1.为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑更复杂,使系统复杂化。
2.享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。