技术开发 频道

老生常谈:小议.NET享元模式

   第一:单纯享元模式。

  1: 单纯享元模式结构图:

  2:单纯享元模式构成说明:

  1>:抽象享元(Flyweight)角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口。那些需要外蕴状态(External State)的操作可以通过调用商业方法以参数形式传入。

/// <summary>
    
/// "Flyweight"
    
/// </summary>
    abstract class Flyweight
    {
        
// Methods
        /// <summary>
        
/// 抽象享元对象的商业方法
        
/// </summary>
        
/// <param name="extrinsicstate">外蕴状态</param>
        abstract public void Operation(int extrinsicstate);
    }

  2>:具体享元(ConcreteFlyweight)角色:实现抽象享元角色所规定的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。享元对象的内蕴状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享的。

/// <summary>
    
/// "ConcreteFlyweight"
    
/// </summary>
    class ConcreteFlyweight : Flyweight
    {
        
private string intrinsicstate = "A";
        
// Methods
        override public void Operation(int extrinsicstate)
        {
            Console.WriteLine(
"ConcreteFlyweight: intrinsicstate {0}, extrinsicstate {1}",
              intrinsicstate, extrinsicstate);
        }
    }

  3>:享元工厂(FlyweightFactory)角色:本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否已经有一个复合要求的享元对象。如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。

  注意:客户端不可以直接实例化享元类,必须通过享元工厂类来创建,因为享元工厂类在系统中只能有一个,所以可以结合单例模式来改善。当客户端需要单纯享元对象时,需要调用享元工厂的Singleton()方法,此时工厂会取得所有的单纯享元对象,然后传入所需的单纯享元对象的内蕴状态,工厂方法负责产生所需要的享元对象。 

/// <summary>
    
/// "FlyweightFactory"
    
/// </summary>
    class FlyweightFactory
    {
        
// Fields
        private Dictionary<string, Flyweight> flyweights = new Dictionary<string, Flyweight>();
        
private static readonly FlyweightFactory instance = new FlyweightFactory();
        
/// <summary>
        
/// Constructors
        
/// </summary>
        private  FlyweightFactory()
        {          
        }

        
// Methods
        /// <summary>
        
/// 从享元工厂中生产出一个具体的享元对象
        
/// </summary>
        
/// <param name="key">内蕴状态</param>
        
/// <returns></returns>
        public Flyweight GetFlyweight(string key)
        {
            
return ((Flyweight)flyweights[key]);
        }
        
/// <summary>
        
/// 享元工厂单例方法
        
/// </summary>
        
/// <returns></returns>
        public static  FlyweightFactory Singleton()
        {
            
return FlyweightFactory.instance;
        }
        
/// <summary>
        
/// 向享元工厂对象增加一个享元对象
        
/// </summary>
        
/// <param name="sKey">内蕴状态</param>
        
/// <param name="_Flyweight">具体享元对象</param>
        public void AddFlyweight(string sKey, Flyweight _Flyweight)
        {
            flyweights.Add(sKey , _Flyweight);
        }
        
public Flyweight factory(string sKey)
        {
            
if (flyweights.ContainsKey(sKey))
            {
                
return this.GetFlyweight(sKey);
            }
            
else
            {
                
this.AddFlyweight(sKey, new ConcreteFlyweight());
                
return this.GetFlyweight(sKey);
            }      
        }
    }

  4>:客户端(Client)角色:需要维护一个对所有享元对象的引用;需要自行存储所有享元对象外蕴状态。

// 初始化外蕴状态值
            int extrinsicstate = 22;
            
//享元工厂对象使用单例
            FlyweightFactory f = FlyweightFactory.Singleton () ;
        
            
//调用过程
            
//向享元工厂对象请求一个内蕴状态为"X"的单纯享元对象
            Flyweight fx = f.factory("X");
            
//调用X的商业方法,X的外蕴状态值为21
            fx.Operation(--extrinsicstate);

            Flyweight fy
= f.factory("Y");
            fy.Operation(
--extrinsicstate);

            Flyweight fz
= f.factory("Z");
            fz.Operation(
--extrinsicstate);
0
相关文章