Structual设计--Flyweight模式
2015-06-03 09:33
92 查看
1.意图
运用共享技术有效地支持大量细粒度的对象。2.别名
无3.动机
有些应用程序得意于在其整个设计过程中采用对象技术,但简单化的实现代价极大。如我们在使用word的时候,如果设置正文字体为:text.setFont(new Font(“細明體”, Style.BOLD, 12));每一个文字我们都需要这样设置,内存太大,而且也非常难记,稍有不注意就会出错。所以通常并不是对每个字符都用一个单独的对象去表示。Flyweight模式描述了如何共享对象,是的可以细粒度地使用他们而无需高昂的代价。4.适用性
Flyweight模式的有效性很大程度上取决于如何使用它以及在何处使用它。当以下情况都成立时使用Flyweight模式:一个应用程序使用了大量的对象
完全由于大量的对象,造成很大的存储开销
对象的大多数状态都可变为外部状态。
如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
应用程序不依赖于对象标识。由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。
5.结构
享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象,FlyWeight是超类。一提到共享池,我们很容易联想到Java里面的JDBC连接池,想想每个连接的特点,我们不难总结出:适用于作共享的一些个对象,他们有一些共有的属性,就拿数据库连接池来说,url、driverClassName、username、password及dbname,这些属性对于每个连接来说都是一样的,所以就适合用享元模式来处理,建一个工厂类,将上述类似属性作为内部数据,其它的作为外部数据,在方法调用时,当做参数传进来,这样就节省了空间,减少了实例的数量。
看个例子:
6.代码示例
看下数据库连接池的代码:[code]public class ConnectionPool { private Vector<Connection> pool; /*公有属性*/ private String url = "jdbc:mysql://localhost:3306/test"; private String username = "root"; private String password = "root"; private String driverClassName = "com.mysql.jdbc.Driver"; private int poolSize = 100; private static ConnectionPool instance = null; Connection conn = null; /*构造方法,做一些初始化工作*/ private ConnectionPool() { pool = new Vector<Connection>(poolSize); for (int i = 0; i < poolSize; i++) { try { Class.forName(driverClassName); conn = DriverManager.getConnection(url, username, password); pool.add(conn); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } } /* 返回连接到连接池 */ public synchronized void release() { pool.add(conn); } /* 返回连接池中的一个数据库连接 */ public synchronized Connection getConnection() { if (pool.size() > 0) { Connection conn = pool.get(0); pool.remove(conn); return conn; } else { return null; } } }
通过连接池的管理,实现了数据库连接的共享,不需要每一次都重新创建连接,节省了数据库重新创建的开销,提升了系统的性能!
7.相关模式
Flyweight模式通常和Composite模式结合起来,用共享叶结点的有向无环图实现一个逻辑上的层次结构。通常,最好用Flyweight实现State和Strategy对象。
引用:
http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm
http://item.jd.com/10057319.html
/article/1354307.html
相关文章推荐
- 大数据:CDH和Cloudera Express的介绍
- 在Nginx中拦截特定用户代理的教程
- 标准偏差(标准差)
- AVL树的旋转操作 图解 最详细
- c++多继承
- MySQL性能调优
- document.domain 跨域问题
- 移动端重构--重置样式
- Viewpage实现左右无限滑动
- linux命令:使用dig解析域名
- 超碰在线视频网站源码,AVS超碰源码,国外视频**脚本搭建教程
- oracle分页查询sql原理与语句
- 解密Python中的描述符(descriptor)
- 有效处理Java异常三原则
- 可以看的东西
- ICCAVR编译报错 !E <library>(197): area 'bss' not large enough
- 当post 的字段很多,post的字段并不完全修改(有的值是前端input的值,有的任保留原来原来数据库的值),
- UI 收集
- git - 简易指南
- git - 简易指南