C#设计模式——享元模式(Flyweight Pattern)

一、概述

在软件开发中,我们有时需要创建大量细粒度的对象,比如文档处理系统就可能需要创建成千上万的字符对象。但如果对每个字符对象都分配内存,那么在系统运行时就会耗费大量的内存。如何在保留面向对象操作方式优点的同时避免创建大量的对象呢?这就到了享元模式发挥作用的时候了。

二、享元模式

享元模式运用共享技术有效地支持大量细粒度的对象。例如可以对文档处理系统创建共享池,在共享池中建立字母和代码的对应关系,这样就可以用共享池中的26个对象解决需要创建大量对象的问题。其结构图如下:

C#设计模式——享元模式(Flyweight Pattern)

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     }

 

你可能感兴趣的:(flyweight)