享元模式困境
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; }
}
这个 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; }
}