摘自:http://www.cnblogs.com/saville/archive/2013/02/18/2916301.html
使用场合:如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时可以考虑使用;还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态那么可以用相对较少的共享对象取代很多组对象,可以考虑使用享元模式。
享元模式运用共享技术有效地支持大量细粒度的对象。例如可以对文档处理系统创建共享池,在共享池中建立字母和代码的对应关系,这样就可以用共享池中的26个对象解决需要创建大量对象的问题。其结构图如下:
Flyweight定义了享元接口,外部对象通过这个接口来访问具体的享元对象。
ConcreteFlyweight实现Flyweight接口,定义了具体的享元对象,并保存享元对象的内部状态。该享元对象是可共享的。
UnsharedConcreteFlyweight实现Flyweight接口,定义了不用于共享的享元对象。
FlyweightFactory创建并管理享元对象。
Client保存对享元接口的引用,通过该引用有效的使用具体的享元对象。
代码:
public abstract class Character { public int Size { get; set; } public Color Color { get; set; } protected char _c; public Character() { Size = 10; Color = Color.Black; } public override string ToString() { return string.Format("Character is {0}, Size is {1}, Color is {2}", _c, Size.ToString(), Color.ToString()); } }
public class CharacterA : Character { public CharacterA() { _c = 'A'; } } public class CharacterB : Character { public CharacterB() { _c = 'B'; } } public class CharacterC : Character { public CharacterC() { _c = 'C'; } }
public static class CharacterFactory { private static Dictionary<char, Character> _characters; static CharacterFactory() { _characters = new Dictionary<char, Character>(); _characters.Add('a', new CharacterA()); _characters.Add('b', new CharacterB()); _characters.Add('c', new CharacterC()); } public static Character GetCharacter(char c) { return _characters[c]; } }
调用:
static void Main(string[] args) { Character character = CharacterFactory.GetCharacter('a'); Console.WriteLine(character.ToString()); character = CharacterFactory.GetCharacter('b'); character.Size = 20; character.Color = Color.Red; Console.WriteLine(character.ToString()); character = CharacterFactory.GetCharacter('c'); character.Size = 15; character.Color = Color.Yellow; Console.WriteLine(character.ToString()); }
.net中的字符串string使用FlyWeight模式,Object.ReferenceEquals(object objA,object objB)中,创建字符串时如果不存在则创建,如果存在直接把引用指向已存在的字符串,所以中
flag = true。
string objA = "gf"; string objB = "gf"; bool flag = Object.ReferneceEquals(objA,objB);