【HeadFirst 设计模式学习笔记】15 享元模式拾零

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

这个模式也是这本书中没有详细阐明的,其实这个模式多多少少有点单例模式+简单工厂模式的意味。在Java 中,String对象就是用享元模式进行管理的——Java将所有固定的String都放在了一个常量池中,相同的String只保存一份拷贝——这个带来的好处是显而易见的,内存占用和创建对象的开销都随之降低——这个模式适用于常用的细粒度可共享对象的创建。

我们设想一个问题场景:在一个预约程序中用于表达时间的类Time

























在一个程序中可能用到这个类非常多次,而且如果小时和分钟相同的话,其实这个类产生的内存对象是可以共享而不影响功能的。尤其是这个应用场景中,预约的时间往往不是正点就是半点,最多可能是15分、45分这样的时间,如果能共享内存则会明显省去很多的内存对象。

这个共享内存的操作是由一个简单工厂方法提供的,在这个类中维护了一个HashMap,完成了类似内存池的功能,若在hashmap中没有该时间的话就new一个time对象,然后放入其中以便以后维护,若有的话则直接返回那个对象即可:



</STRING,TIME></STRING,TIME>











最后,我们看一下这个UML图:

【HeadFirst 设计模式学习笔记】15 享元模式拾零

在这个UML图中,Flywright做了进一步的抽象,UnsharedConcreteFlyWeight类和ConcreteFlyweight类继承与Flyweight类(定义了抽象方法Operation),这两个类的不同点在于FlyweightFactory只维护了ConcreteFlyweight,而对UnsharedConcreteFlyWeight则不参与。其实UnsharedConcreteFlyWeight并非是享元模式必须的类,放在这里只是一个抽象的需要,它的创建就是使用普通的new操作。

在线视频:http://v.youku.com/v_show/id_XMjU2Njk0NzE2.html

参考文献:http://www.developer.com/tech/article.php/10923_3677501_2/Working-with-Design-Patterns-Flyweight.htm

 

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/


               作者:gnuhpc
               出处:http://www.cnblogs.com/gnuhpc/
               除非另有声明,本网站采用知识共享“署名 2.5 *”许可协议授权。


分享到:

上一篇:tinypng upload一键压缩上传工具


下一篇:java web 程序--注册页面/HashMap的用法。。要懂啊