设计模式学习笔记十一——Flyweight模式

动机:有时采用纯粹面向对象方案导致系统中存在大量细粒度对象,带来很高的运行时代价——内存开销。如果避免大量细粒度对象问题,同时让客户程序能透明地使用面向对象特性进行操作?运用共享技术有效地支持大量细粒度的对象。具体做法是把少量的共享对象存储于对象池,大量对象对其进行引用。

应用:图文编辑器

场景:考虑文本编辑器,如果每个字符生成一个全新独立对象,将生成大量细粒度对象,该对象的某些属性对象全新生成将消耗大量内存,如字体属性。如果把这些字体对象放对象池中,字符对象对其进行引用将节省大量内存。


结构

Flyweight模式结构图


代码实现

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;
                }

            }

        }

    }

}

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;
        }

    }

}


要点
1、本设计模式主要解决面向对象的代价问题,一般不触及面向对象的抽象性问题。
2、本模式通过共享对象来减少系统中对象个数,从而减少内存消耗。在具体实现时,要注意状态的处理。
3、根据实际情况评估对象数量巨大带来的性能影响,共享对象后对性能的影响。以判断是否需要使用此模式以及该把那些对象放共享对象池中。

你可能感兴趣的:(flyweight)