using System; using System.Collections.Generic; using System.Text; using System.Collections; ///Flyweight(享元)模式采用共享来避免大量拥有相同内容对象的开销。 ///add by jzh 2007-04-24 namespace DesignPattern { /// <summary> /// 享元工厂(FlyweightFactory)角色:本角色负责创建和管理享元角色。 /// 本角色必须保证享元对象可以被系统适当地共享。 /// 当一个客户端对象调用一个享元对象的时候, /// 享元工厂角色会检查系统中是否已经有一个复合要求的享元对象。 /// 如果已经有了,享元工厂角色就应当提供这个已有的享元对象; /// 如果系统中没有一个适当的享元对象的话, /// 享元工厂角色就应当创建一个合适的享元对象。 /// </summary> class FlyweightFactory { private ArrayList pool = new ArrayList(); // the flyweightfactory can crete all entries in the pool at startup // (if the pool is small, and it is likely all will be used), or as // needed, if the pool si large and it is likely some will never be used public FlyweightFactory() { pool.Add(new ConcreteEvenFlyweight()); pool.Add(new ConcreteUnevenFlyweight()); } public Flyweight GetFlyweight(int key) { int i = key % 2; return ((Flyweight)pool[i]); } } /// <summary> /// 抽象享元(Flyweight)角色:此角色是所有的具体享元类的超类, /// 为这些类规定出需要实现的公共接口, /// 通过这个接口Flyweight可以接受并作用于外部状态(Extrinsic State)。 /// </summary> abstract class Flyweight { abstract public void DoOperation(int extrinsicState); } /// <summary> /// 具体享元(ConcreteFlyweight)角色:实现抽象享元角色所规定的接口。 /// 如果有内蕴状态(Intrinsic State)的话, /// 必须负责为内蕴状态提供存储空间。 /// 享元对象的内蕴状态必须与对象所处的周围环境无关, /// 从而使得享元对象可以在系统内共享的。 /// </summary> class UnsharedConcreteFlyweight : Flyweight { override public void DoOperation(int extrinsicState) { } } class ConcreteEvenFlyweight : Flyweight { override public void DoOperation(int extrinsicState) { Console.WriteLine("In ConcreteEvenFlyweight.DoOperation: {0}", extrinsicState); } } class ConcreteUnevenFlyweight : Flyweight { override public void DoOperation(int extrinsicState) { Console.WriteLine("In ConcreteUnevenFlyweight.DoOperation: {0}", extrinsicState); } } public class Client { public static void Main(string[] args) { int[] data = { 1, 2, 3, 4, 5, 6, 7, 8 }; FlyweightFactory f = new FlyweightFactory(); int extrinsicState = 3; foreach (int i in data) { Flyweight flyweight = f.GetFlyweight(i); flyweight.DoOperation(extrinsicState); } Console.ReadLine(); } } }