享元设计模式(Flyweight Design Pattern)通过共享技术实现相同或相似对象的重用,节省内存,前提是享元对象是不可变对象。
古代的活字印刷术就有点像享元模式,活字印刷就是将每个字模做出来,再印刷时再选取需要的字模到印刷板上,这样就构成了一页书的印刷板。这样的活字印刷大大提升了效率,减少了印刷板的空间。
在享元模式中,存储共享实例对象的地方称为享元池(Flyweight Pool)。类比到上述的活字印刷术中,放置字模的地方就是享元池。
享元模式能做到共享的关键是区分了内部状态和外部状态,它们的简单释义是:
外部状态:通常由客户端保存,当需要时再传入享元对象中的状态,会跟随环境变化而改变,不可以在对象之间共享。
一个典型的享元工厂类的代码示例如下:
通常,实际会根据业务情况定义具体享元类,代码示例如下:
享元模式的主要优点如下:
在 Java 类库中的 String 类就使用了享元模式,使用字面量创建的对象是共享的,而不会重新为此分配内存空间。