动机:有时采用纯粹面向对象方案导致系统中存在大量细粒度对象,带来很高的运行时代价——内存开销。如果避免大量细粒度对象问题,同时让客户程序能透明地使用面向对象特性进行操作?运用共享技术有效地支持大量细粒度的对象。具体做法是把少量的共享对象存储于对象池,大量对象对其进行引用。
应用:图文编辑器
场景:考虑文本编辑器,如果每个字符生成一个全新独立对象,将生成大量细粒度对象,该对象的某些属性对象全新生成将消耗大量内存,如字体属性。如果把这些字体对象放对象池中,字符对象对其进行引用将节省大量内存。
结构
代码实现
要点
1、本设计模式主要解决面向对象的代价问题,一般不触及面向对象的抽象性问题。
2、本模式通过共享对象来减少系统中对象个数,从而减少内存消耗。在具体实现时,要注意状态的处理。
3、根据实际情况评估对象数量巨大带来的性能影响,共享对象后对性能的影响。以判断是否需要使用此模式以及该把那些对象放共享对象池中。
应用:图文编辑器
场景:考虑文本编辑器,如果每个字符生成一个全新独立对象,将生成大量细粒度对象,该对象的某些属性对象全新生成将消耗大量内存,如字体属性。如果把这些字体对象放对象池中,字符对象对其进行引用将节省大量内存。
结构
代码实现
namespace DesignPattern.Flyweight
{
public class Charactor
{
private static IList<Font> fontPool = new List<Font>();
private char chr;
private Font font;
public Charactor()
{
}
public char Char
{
get
{
return chr;
}
set
{
chr = value;
}
}
public Font Font
{
get
{
return font;
}
set
{
if (fontPool.Contains(value))
{
font = fontPool[fontPool.IndexOf(value)];
}
else
{
fontPool.Add(value);
font = value;
}
}
}
}
}
{
public class Charactor
{
private static IList<Font> fontPool = new List<Font>();
private char chr;
private Font font;
public Charactor()
{
}
public char Char
{
get
{
return chr;
}
set
{
chr = value;
}
}
public Font Font
{
get
{
return font;
}
set
{
if (fontPool.Contains(value))
{
font = fontPool[fontPool.IndexOf(value)];
}
else
{
fontPool.Add(value);
font = value;
}
}
}
}
}
namespace DesignPattern.Flyweight
{
public class TextEditer
{
public void Operate()
{
Font font = new Font("宋体", 5);
Charactor c1 = new Charactor();
c1.Char = 'a';
c1.Font = font;
Charactor c2 = new Charactor();
c2.Char = 'a';
c2.Font = font;
}
}
}
{
public class TextEditer
{
public void Operate()
{
Font font = new Font("宋体", 5);
Charactor c1 = new Charactor();
c1.Char = 'a';
c1.Font = font;
Charactor c2 = new Charactor();
c2.Char = 'a';
c2.Font = font;
}
}
}
要点
1、本设计模式主要解决面向对象的代价问题,一般不触及面向对象的抽象性问题。
2、本模式通过共享对象来减少系统中对象个数,从而减少内存消耗。在具体实现时,要注意状态的处理。
3、根据实际情况评估对象数量巨大带来的性能影响,共享对象后对性能的影响。以判断是否需要使用此模式以及该把那些对象放共享对象池中。
欢迎光临我的淘宝http://shop35795100.taobao.com,专营游戏点卡、电话卡及各类充值卡。