1、动机
在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价——主要指内存需求方面的代价。
如何在避免大量细粒度对象问题的同时,让外部客户程序仍然能够透明地使用面相对象的方式来进行操作?
2、举例
比方说我们现在有一种很常见的需求——编辑文档,它可能需要使用多种格式,比如汉字用宋体,字母用楷体,标题用黑体等。如果我们对每个字符都加一个格式,显然需要创建大量对象,是否可以把它们分类,不同类型字符对应不同格式,然后存到模板map中进行差异化创建:
当然上面只写了核心代码,没有特别说明内存释放问题,可以在clear中对fontPool进行释放。
3、模式定义
采用共享技术有效地支持大量细粒度的对象。
4、结构图
5、要点总结
(1)面向对象很好的解决了抽象的问题,但是作为一个运行在机器中的程序实体,我们需要考虑对象的性能问题。FlyWeight主要解决面向对象的代价问题,一般不触及面向对象的抽象问题。
(2)FlyWeight运用对象共享的做法来降低系统中对象的个数,从而降低细粒度对象给系统带来的内存压力。在具体实现方面,要注意对象状态的处理。
(3)对象的数量太大从而导致对象内存开销加大——什么样的数量才算大,这需要我们仔细根据具体应用情况进行评估,而不能凭空臆断。