设计模式<9>------享元模式(Flyweight Pattern)------结构模式
一、概述
在软件开发中,我们有时需要创建大量细粒度的对象,比如文档处理系统就可能需要创建成千上万的字符对象。但如果对每个字符对象都分配内存,那么在系统运行时就会耗费大量的内存。如何在保留面向对象操作方式优点的同时避免创建大量的对象呢?这就到了享元模式发挥作用的时候了。
二、享元模式
享元模式运用共享技术有效地支持大量细粒度的对象。例如可以对文档处理系统创建共享池,在共享池中建立字母和代码的对应关系,这样就可以用共享池中的26个对象解决需要创建大量对象的问题。其结构图如下:

Flyweight定义了享元接口,外部对象通过这个接口来访问具体的享元对象。
ConcreteFlyweight实现Flyweight接口,定义了具体的享元对象,并保存享元对象的内部状态。该享元对象是可共享的。
UnsharedConcreteFlyweight实现Flyweight接口,定义了不用于共享的享元对象。
FlyweightFactory创建并管理享元对象。
Client保存对享元接口的引用,通过该引用有效的使用具体的享元对象。
三、示例
我们简单的实现本文开头所表述的文档处理系统。
首先定义Flyweight。
1 public abstract class Character
2 {
3 public int Size { get; set; }
4 public Color Color { get; set; }
5 protected char _c;
6
7 public Character()
8 {
9 Size = 10;
10 Color = Color.Black;
11 }
12
13 public override string ToString()
14 {
15 return string.Format("Character is {0}, Size is {1}, Color is {2}", _c, Size.ToString(), Color.ToString());
16 }
17 }
然后实现具体的享元对象。
1 public class CharacterA : Character
2 {
3 public CharacterA()
4 {
5 _c = 'A';
6 }
7 }
8
9 public class CharacterB : Character
10 {
11 public CharacterB()
12 {
13 _c = 'B';
14 }
15 }
16
17 public class CharacterC : Character
18 {
19 public CharacterC()
20 {
21 _c = 'C';
22 }
23 }
接着定义FlyweightFactory并建立共享池。
1 public static class CharacterFactory
2 {
3 private static Dictionary<char, Character> _characters;
4
5 static CharacterFactory()
6 {
7 _characters = new Dictionary<char, Character>();
8 _characters.Add('a', new CharacterA());
9 _characters.Add('b', new CharacterB());
10 _characters.Add('c', new CharacterC());
11 }
12
13 public static Character GetCharacter(char c)
14 {
15 return _characters[c];
16 }
17 }
最后看一下如何使用这些享元对象。
1 static void Main(string[] args)
2 {
3 Character character = CharacterFactory.GetCharacter('a');
4 Console.WriteLine(character.ToString());
5 character = CharacterFactory.GetCharacter('b');
6 character.Size = 20;
7 character.Color = Color.Red;
8 Console.WriteLine(character.ToString());
9 character = CharacterFactory.GetCharacter('c');
10 character.Size = 15;
11 character.Color = Color.Yellow;
12 Console.WriteLine(character.ToString());
13 }


浙公网安备 33010602011771号