从FLC中学习的设计模式系列-结构型模式(3)-享元模式
享元模式是使用共享部件减少内存占用
享元模式
http://zh.wikipedia.org/wiki/享元模式
享元模式(英语:Flyweight Pattern)是一种软件设计模式。它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。
典型的享元模式的例子为文书处理器中以图形结构来表示字符。一个做法是,每个字形有其字型外观, 字模 metrics, 和其它格式资讯,但这会使每个字符就耗用上千字节。取而代之的是,每个字符参照到一个共享字形物件,此物件会被其它有共同特质的字符所分享;只有每个字符(文件中或页面中)的位置才需要另外储存。
FCL中的享元模式
在绘图时常有的Brushes和Pens的各个公共属性都是享元模式的典型。
注意虽然Colors类似,但Color是结构,不存在共享,所以不是享元模式
就拿Brushes类举例:
Brushes 类
实现一组预定义的 SolidColorBrush 对象。
属性有一大堆:颜色名如:
AliceBlue 获取具有十六进制值 #FFF0F8FF 的纯色填充颜色。
AntiqueWhite 获取具有十六进制值 #FFFAEBD7 的纯色填充颜色。
Aqua 获取具有十六进制值 #FF00FFFF 的纯色填充颜色。
Aquamarine 获取具有十六进制值 #FF7FFFD4 的纯色填充颜色。
Azure 获取具有十六进制值 #FFF0FFFF 的纯色填充颜色。
Beige 获取具有十六进制值 #FFF5F5DC 的纯色填充颜色。
Bisque 获取具有十六进制值 #FFFFE4C4 的纯色填充颜色。
Black 获取具有十六进制值 #FF000000 的纯色填充颜色。
...
下面来看看怎么使用享元
假设有N个glyphs图形,需要让他们都成为黑色Black:
glyphs1.Fill = new SolidColorBrush(Colors.Black ); glyphs2.Fill = new SolidColorBrush(Colors.Black ); glyphs3.Fill = new SolidColorBrush(Colors.Black ); .. glyphsN.Fill = new SolidColorBrush(Colors.Black );
发现SolidColorBrush严重浪费内存,使用Brushes 提供的Black共享SolidColorBrush,修改后如下:
glyphs1.Fill = SolidColorBrush.Black; glyphs2.Fill = SolidColorBrush.Black; glyphs3.Fill = SolidColorBrush.Black; .. glyphsN.Fill = SolidColorBrush.Black;