#region Helper
public enum eNumbers
{
One,
Two,
Three,
// .. and so on with every number
}
#endregion
#region The Flyweight Factory
public class NumbersFactory
{
#region Members
private Dictionary<eNumbers, Number> _numbers =
new Dictionary<eNumbers, Number>();
#endregion
#region Methods
public Number GetNumber(eNumbers number)
{
if (!_numbers.ContainsKey(number))
{
switch (number)
{
case (eNumbers.One):
{
_numbers.Add(number, new One());
break;
}
case (eNumbers.Two):
{
_numbers.Add(number, new Two());
break;
}
case (eNumbers.Three):
{
_numbers.Add(number, new Three());
break;
}
// ... and so on with every number
default:
{
break;
}
}
}
return _numbers[number];
}
#endregion
}
#endregion
#region The Flyweight
public abstract class Number
{
#region Members
protected int _number;
protected string _numberName;
protected int _numberSize;
#endregion
#region Methods
public abstract void WriteNumber(int numberSize);
#endregion
}
#endregion
#region The Flyweight Concrete
public class One : Number
{
#region Ctor
public One()
{
this._number = 1;
this._numberName = "One";
}
#endregion
#region Methods
public override void WriteNumber(int numberSize)
{
this._numberSize = numberSize;
Console.WriteLine(string.Format("{0} is size {1}",
_numberName, _numberSize));
}
#endregion
}
public class Two : Number
{
#region Ctor
public Two()
{
this._number = 2;
this._numberName = "Two";
}
#endregion
#region Methods
public override void WriteNumber(int numberSize)
{
this._numberSize = numberSize;
Console.WriteLine(string.Format("{0} is size {1}",
_numberName, _numberSize));
}
#endregion
}
public class Three : Number
{
#region Ctor
public Three()
{
this._number = 3;
this._numberName = "Three";
}
#endregion
#region Methods
public override void WriteNumber(int numberSize)
{
this._numberSize = numberSize;
Console.WriteLine(string.Format("{0} is size {1}",
_numberName, _numberSize));
}
#endregion
}
// ... Four, Five and so on
#endregion
The example include 3 parts - the flyweight factory (NumberFactory), the flyweight
itself (Number) and flyweight concretes (One, Two, Three). You can see that lazy loading
is used in the factory. Whenever a number is needed and isn't in the factory I build it and
then return it in the GetNumber method.