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) ...
-
设计模式之&mdash;&mdash;flyweight模式
flyweight模式,又叫做享元模式. 顾名思义,享元模式就是共享一个元素. 百度百科 解释为: 享元模式(英语:Flyweight Pattern)是一种软件设计模式.它使用共享物件,用来尽可能减 ...
随机推荐
-
JS双月份显示联动效果,点击日期浮出消息提示
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
-
Lost Cows(线段树 POJ2182)
Lost Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10354 Accepted: 6631 Descriptio ...
-
chrome中tcmalloc的使用
chrome中内存分配采用了第三方库tcmalloc,这个库主要提供给应用程序内存管理方面的优化,按资料说内存存取速度会从300ns降到50ns.更具体的关于这个tcmalloc的信息大家可以查网上的 ...
-
Redis 数据库结构设计
Redis设计参考资料: http://my.oschina.net/fsmwhx/blog/152130 http://my.oschina.net/1123581321/blog/164288 h ...
-
Apache / PHP 5.x Remote Code Execution Exploit
测试方法: 本站提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负! /* Apache Magica by Kingcope */ /* gcc apache-magika.c -o ...
-
android开发——数独游戏
最近研究了一下android,写了一个数独游戏,具体如下: 游戏界面需要重写一个ShuduView继承View, 然后自定义一个Dialog: 1.需要继承 Dialog 类, 2.并要定义一个有参构 ...
-
iOS基础 - iOS程序启动原理
一.UIApplicationMain 在main.m的main函数中执行了UIApplicationMain这个方法,这是ios程序的入口点 int UIApplicationMain(int ar ...
-
Unity3D实现多语言切换
项目现在需要做多语言切换部分,下面是一个基本多语言切换实现 1. 首先建立一个类来存放字符,其中包括一个静态方法来根据Key和语言类型获取对应字符 using System.Collections; ...
-
PHP:自己写的mysql操作类
a{ font-weight: bold; display: block; text-align: center; color: #5887bf; font-size: 22px; } .conten ...
-
解决Windows 10笔记本接显示器分屏后没有声音的问题
Windows 10 版本号:17763.292 1.首先右键点击任务栏托盘中的[扬声器]图标,选择[声音],如下图所示. 2.选择[播放],然后选择[扬声器],再点击[设为默认值],如下所示. 3. ...