风动破

导航

设计模式之享元

http://www.cnblogs.com/saville/archive/2013/02/18/2916301.html
享元模式运用共享技术有效地支持大量细粒度的对象。例如可以对文档处理系统创建共享池,
在共享池中建立字母和代码的对应关系,这样就可以用共享池中的26个对象解决需要创建大量对象的问题。
Flyweight定义了享元接口,外部对象通过这个接口来访问具体的享元对象。
ConcreteFlyweight实现Flyweight接口,定义了具体的享元对象,并保存享元对象的内部状态。该享元对象是可共享的。
UnsharedConcreteFlyweight实现Flyweight接口,定义了不用于共享的享元对象。
FlyweightFactory创建并管理享元对象。
Client保存对享元接口的引用,通过该引用有效的使用具体的享元对象。 

========================================= 

public class FlyWeightMode

    {
        public FlyWeightMode() {
            Character character = CharacterFactory.GetCharacter('a');
            Console.WriteLine(character.ToString());
            character = CharacterFactory.GetCharacter('b');
            character.Size = 20;
            character.Color = Color.Yellow;
            Console.WriteLine(character.ToString());
            character = CharacterFactory.GetCharacter('c');
            character.Size = 20;
            character.Color = Color.Red;
            Console.WriteLine(character.ToString());
        }
    }
    public enum Color { 
        Black,
        Red,
        Yellow
    }
    /// <summary>
    /// 定义Flyweight。
    /// </summary>
    public abstract class Character 
    {
        public int Size { get; set; }
        public Color Color { get; set; }
        protected char _c;
        public Character() {
            Size = 10;
            Color = Color.Black;
        }
        public override string ToString()
        {
            return string.Format("Character is {0},Size is {1},Color is {2}",_c,Size,Color);
        }
    }
    #region /*实现具体的享元对象。*/
    public class CharacterA : Character {
        public CharacterA() { _c = 'A'; }
    }
    public class CharacterB : Character
    {
        public CharacterB() { _c = 'B'; }
    }
    public class CharacterC : Character
    {
        public CharacterC() { _c = 'C'; }
    }
    #endregion /*================实现具体的享元对象。==============*/
    //定义FlyweightFactory并建立共享池。
    public static class CharacterFactory {
        private static Dictionary<char, Character> _character;
        static CharacterFactory() {
            _character = new Dictionary<char, Character>();
            _character.Add('a', new CharacterA());
            _character.Add('b', new CharacterB());
            _character.Add('c', new CharacterC());
        }
        public static Character GetCharacter(char c) { 
            return _character[c];
        }
    }

posted on 2015-05-04 14:40  风动破  阅读(119)  评论(0)    收藏  举报