Дилемма узкого веса - PullRequest
       16

Дилемма узкого веса

0 голосов
/ 02 июня 2018

Этот учебник по Flyweight DP показывает хорошее объяснение шаблона Flyweight.

В любом случае, допустим, что мы хотим изменить размер шрифта this.height = 200; (предположим, что свойстване защищены).Это означает, что все размеры шрифта будут изменены, поскольку объекты относятся к справочному типу.

Допустим, это текстовый редактор, и мы хотим изменить размер шрифта только для конкретной буквы (один экземплярписьмо не всем).Итак, теперь возникает проблема, поскольку, если мы каким-либо образом изменим размер шрифта объекта в словаре, все вхождения будут изменены.Как я могу справиться с этим?

1 Ответ

0 голосов
/ 02 июня 2018

Я думаю, что это решение может подойти.Это надувной вес внутри навесного веса, но в C # он немного упрощен, но я думаю, что вы должны понять эту концепцию.Идея состоит в том, чтобы поставить фасад на место, чтобы получить параметризованные классы.Внутри этого фасада у меня есть словарь, который делает новые фабрики для новых размеров шрифтов.Это может показаться странным, но имейте в виду, что flyweight - это шаблон творческого проектирования, он не будет хранить сам текст, а только даст вам доступ к тем же объектам.И состояние явно не то же самое, поэтому я думаю, что другой завод может быть оправдан.

    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; }
     }
...