我们写文档的时候不可能对每一个字符都进行内存分配,只需要对基本字符分配内存然后进行复用就可以了。

 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {

        public abstract class Character
        {
            private int size;
            private string color;
            public char c;

            public int Size
            {
                get { return size; }
                set { size = value; }
            }

            public string Color
            {
                get { return color; }
                set { color = value; }
            }

            public Character()
            {
                Size = 10;
                Color = "red";
            }

            public override string ToString()
            {
                return string.Format("C: {0}, Color: {1}, Size: {2}", c, color, size);
            }
        }

        public class CharacterA : Character
        {
            public CharacterA()
            {
                c = 'c';
            }
        }

        public class CharacterB : Character
        {
            public CharacterB()
            {
                c = 'b';
            }


        }


        public class FlyweightCharacter
        {
            private Dictionary<char, Character> characters;

            public Character GetCharacter(char c)
            {
                Character charact;
                if (characters.TryGetValue(c, out charact))
                {
                    return charact;
                }
                else
                {
                    return null;
                }

            }

            private FlyweightCharacter()
            {
                characters = new Dictionary<char, Character>();
                characters.Add('a', new CharacterA());
                characters.Add('b', new CharacterB());
            }

            private static FlyweightCharacter instance;

            public static FlyweightCharacter Instance
            {
                get
                {
                    if (instance == null)
                    {
                        instance = new FlyweightCharacter();
                    }

                    return instance;
                }
                set { instance = value; }
            }
        }

        static void Main(string[] args)
        {
            Character character = FlyweightCharacter.Instance.GetCharacter('a');
            Console.WriteLine(character.ToString());

        }
    }
}