Structual设计--Flyweight模式
1.意图
运用共享技术有效地支持大量细粒度的对象。
2.别名
无
3.动机
有些应用程序得意于在其整个设计过程中採用对象技术,但简单化的实现代价极大。如我们在使用word的时候。假设设置正文字体为:text.setFont(new Font(“細明體”, Style.BOLD, 12));每一个文字我们都须要这样设置,内存太大。并且也非常难记,稍有不注意就会出错。所以通常并非对每一个字符都用一个单独的对象去表示。
Flyweight模式描写叙述了怎样共享对象。是的能够细粒度地使用他们而无需高昂的代价。
4.适用性
Flyweight模式的有效性非常大程度上取决于怎样使用它以及在何处使用它。当下面情况都成立时使用Flyweight模式:
- 一个应用程序使用了大量的对象
- 全然因为大量的对象,造成非常大的存储开销
- 对象的大多数状态都可变为外部状态。
- 假设删除对象的外部状态,那么能够用相对较少的共享对象代替非常多组对象。
- 应用程序不依赖于对象标识。因为Flyweight对象能够被共享,对于概念上明显有别的对象,标识測试将返回真值。
5.结构
享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候能够降低内存的开销。通常与工厂模式一起使用。
FlyWeightFactory负责创建和管理享元单元,当一个client请求时。工厂须要检查当前对象池中是否有符合条件的对象,假设有。就返回已经存在的对象。假设没有,则创建一个新对象,FlyWeight是超类。
一提到共享池,我们非常easy联想到Java里面的JDBC连接池,想想每一个连接的特点。我们不难总结出:适用于作共享的一些个对象。他们有一些共同拥有的属性,就拿数据库连接池来说。url、driverClassName、username、password及dbname。这些属性对于每一个连接来说都是一样的。所以就适合用享元模式来处理,建一个工厂类,将上述相似属性作为内部数据,其他的作为外部数据。在方法调用时,当做參数传进来,这样就节省了空间。降低了实例的数量。
看个样例:
6.代码演示样例
看下数据库连接池的代码:
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
http://blog.csdn.net/zhangerqing/article/details/8239539
Structual设计--Flyweight模式的更多相关文章
- Structual设计--Bridge模式
1.意图 将抽象部分与它的实现部分分离.使他们都能够独立地变化. 2.别名 Handle/Body 3.动机 当一个抽象对象可能有多个实现时,通经常使用继承来协调它们.抽象类定义对该抽象的接口.而详细 ...
- Flyweight 模式
如果一个应用程序使用了太多的对象, 就会造成很大的存储开销. 特别是对于大量轻量级 (细粒度)的对象,比如在文档编辑器的设计过程中,我们如果为每个字母创建一个对象的话,系统可能会因为大量的对象而造成存 ...
- Flyweight模式_Java中23种设计模式
—————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— 享元模式: Flyweight模式的有效性很大程度上取决于如何使用它以及在何处使用 ...
- Java设计模式(5)共享模式/享元模式(Flyweight模式)
Flyweight定义:避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). 为什么使用共享模式/享元模式 面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可 ...
- Flyweight模式(亨元模式)
这应该算是最好理解的一个设计模式了吧·················· 面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可能显得很庞大,比如,字处理软件,如果以每个文字都作为一个 ...
- flyweight模式
参考资料 • 维基百科:https://en.wikipedia.org/wiki/Flyweight_pattern • 百度百科:http://baike.baidu.com/link?url=R ...
- 常见设计模式解析和实现(C++)FlyWeight模式
作用:运用共享技术有效地支持大量细粒度的对象 UML结构图: 解析: Flyweight模式在大量使用一些可以被共享的对象的时候使用.比如,在QQ聊天时很多时候你懒得回复又不得不回复,一般会用一些客套 ...
- Java 实现享元(Flyweight)模式
/** * 字母 * @author stone * */ public class Letter { private String name; public Letter(String name) ...
- 设计模式之——flyweight模式
flyweight模式,又叫做享元模式. 顾名思义,享元模式就是共享一个元素. 百度百科 解释为: 享元模式(英语:Flyweight Pattern)是一种软件设计模式.它使用共享物件,用来尽可能减 ...
随机推荐
- 【POJ2406】【KMP】Power Strings
Description Given two strings a and b we define a*b to be their concatenation. For example, if a = & ...
- visualSVN server库迁移(转)
转自:http://blog.csdn.net/yuhuijun_1/article/details/9762683 首先,VisualSVN Server Manager,包含两个路径,一个是安装路 ...
- Javascript参数传递中值和引用的一种理解
值(value)和引用(reference)是各种编程语言老生常谈的话题,js也不例外. 我将剖析一个例子的实际运行过程,跟大家分享我对js参数传递中的值和引用的理解. 参考官网数据类型的两种分类,本 ...
- vim技巧:折叠快捷键
vim技巧:折叠快捷键 以前用的挺熟的,一段时间不用了,快捷键又忘了,不得不重新再看手册,今天专门整理一下,以后查找起来也比较方便. zc 折叠,只折叠最外层的折叠zC 对所在范围内所有嵌套的折叠点进 ...
- CSS HACK的方法
所有浏览器 通用 height: 100px; IE6 专用 _height: 100px; IE7 专用 *+height: 100px; IE6.IE7 共用 *height: 100px; IE ...
- div+css知识点
前端书写规范: 1.所有书写均在英文半角状态下的小写: 2.id,class必须以字母开头: 3.所有标签必须闭合: 4.html标签用tab键缩进: 5.属性值必须带引号: 6.<!-- ht ...
- cut 命令使用
cut -d -f cut -c cut -d分隔符 -f分割后取的第几个字符串 cut -c从哪个字符开始取
- Unity3d项目合作 场景的合并和还原
Unity3d项目合作 场景的合并和还原 特别声明:转载自Unity3D研究院 如何侵犯版权,请通知我删除! 摘要: 导出Unity场景的所有游戏对象信息,一种是XML一种是JSON.本篇文章我们把 ...
- 又是干货,这个春节感觉吃饱了。各方面---RHCS集群理论
什么是集群? 集群是一组(>2)相互独立的,通过高速网络互联的计算机组成的集合.群集一般可以分为科学集群,负载均衡集群,高可用性集群三大类. 科学集群是并行计算的基础.它对外就好象一 ...
- Delphi控件的透明与不透明(要挨个解释一下原因),对InvalidateControl的关键理解
procedure TForm1.Button3Click(Sender: TObject);begin if (csOpaque in ControlStyle) then ShowMessage( ...