享元模式困境

Flyweight pattern dilemma

这个 Flyweight DP tutorial 很好地解释了享元模式。

无论如何,假设我们要更改 this.height = 200; 的字体大小(假设属性不受保护)。这意味着所有字体大小都将更改,因为对象是引用类型。

假设这是一个文本编辑器,我们只想更改特定字母的字体大小(字母的单个实例,而不是全部)。所以现在出现了一个问题,因为如果我们以某种方式改变字典中对象的字体大小,所有出现的地方都会改变。我该如何处理?

我认为这是一个可能适合的解决方案。它是享元中的享元,但在 C# 中,它有点简化,但我认为你应该明白这个概念。这个想法是放置一个外观来获得参数化 类。在那个门面里面,我有一本字典,可以为新的字体大小创建新的工厂。这可能看起来很奇怪,但请注意享元是一种创造性的设计模式,它不会存储文本本身,只会让您访问相同的对象。而且州显然不一样,所以我认为不同的工厂可能是合理的。

    public class AlphabetFacade
    {
        private Dictionary<int, AlphabetFactory> _alphabetFactories = new Dictionary<int, AlphabetFactory>();

        private Character GetChar(string character, int fontSize)
        {
            if (_alphabetFactories.ContainsKey(fontSize)) return _alphabetFactories[fontSize].GetCharacter(character);
            var factoryNew = new AlphabetFactory(fontSize);
            _alphabetFactories.Add(fontSize, factoryNew);
            return factoryNew.GetCharacter(character);
        }
    }

    internal class AlphabetFactory
    {
        private readonly int _fontSize;

        private readonly Dictionary<string, Character> _characters = new Dictionary<string, Character>();

        public AlphabetFactory(int fontSize)
        {
            _fontSize = fontSize;
        }

        public Character GetCharacter(string character)
        {
            if (_characters.ContainsKey(character)) return _characters[character];
            var characterNew = new Character(_fontSize, character);
            _characters.Add(character, characterNew);
            return characterNew;
        }
    }

     class Character
     {
         public Character(int size, string @char)
         {
            Size = size;
            Char = @char;
         }

         public int Size { get; }
         public string Char { get; }
     }