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模式的更多相关文章

  1. Structual设计--Bridge模式

    1.意图 将抽象部分与它的实现部分分离.使他们都能够独立地变化. 2.别名 Handle/Body 3.动机 当一个抽象对象可能有多个实现时,通经常使用继承来协调它们.抽象类定义对该抽象的接口.而详细 ...

  2. Flyweight 模式

    如果一个应用程序使用了太多的对象, 就会造成很大的存储开销. 特别是对于大量轻量级 (细粒度)的对象,比如在文档编辑器的设计过程中,我们如果为每个字母创建一个对象的话,系统可能会因为大量的对象而造成存 ...

  3. Flyweight模式_Java中23种设计模式

    —————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— 享元模式: Flyweight模式的有效性很大程度上取决于如何使用它以及在何处使用 ...

  4. Java设计模式(5)共享模式/享元模式(Flyweight模式)

    Flyweight定义:避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). 为什么使用共享模式/享元模式 面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可 ...

  5. Flyweight模式(亨元模式)

    这应该算是最好理解的一个设计模式了吧·················· 面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可能显得很庞大,比如,字处理软件,如果以每个文字都作为一个 ...

  6. flyweight模式

    参考资料 • 维基百科:https://en.wikipedia.org/wiki/Flyweight_pattern • 百度百科:http://baike.baidu.com/link?url=R ...

  7. 常见设计模式解析和实现(C++)FlyWeight模式

    作用:运用共享技术有效地支持大量细粒度的对象 UML结构图: 解析: Flyweight模式在大量使用一些可以被共享的对象的时候使用.比如,在QQ聊天时很多时候你懒得回复又不得不回复,一般会用一些客套 ...

  8. Java 实现享元(Flyweight)模式

    /** * 字母 * @author stone * */ public class Letter { private String name; public Letter(String name) ...

  9. 设计模式之——flyweight模式

    flyweight模式,又叫做享元模式. 顾名思义,享元模式就是共享一个元素. 百度百科 解释为: 享元模式(英语:Flyweight Pattern)是一种软件设计模式.它使用共享物件,用来尽可能减 ...

随机推荐

  1. 头一回发博客,来分享个有关C++类型萃取的编写技巧

    废话不多说,上来贴代码最实在,哈哈! 以下代码量有点多,不过这都是在下一手一手敲出来的,小巧好用,把以下代码复制出来,放到相应的hpp文件即可,VS,GCC下均能编译通过 #include<io ...

  2. VirtualBox 中的UBUNTU和java环境的配置以及各种常用说明

    本来是要ubuntu下学习C++的,但是又懒的用高手们推荐的各种记事本级的操作,所以要用IDE.(我用IDE我自豪,人类的进化就是建立在工具的使用这个基础之上的.)我选用了oracle的netbean ...

  3. Jquery实现图片左右滚动(自动)

    <!DOCTYPE HTML><html><head><title>基于jQuery的控制左右滚动效果_自动滚动版本</title>< ...

  4. 使用jQuery实现跨域提交表单数据

    我们在WEB开发中有时会遇到这种情况,比如要从A网站收集用户信息,提交给B网站处理,这个时候就会涉及到跨域提交数据的问题.本文将给您介绍如何使用jQuery来实现异步跨域提交表单数据.   在jQue ...

  5. mysql中显示方式的切换

    1. mysql中如果使用\G,则':'不用写.如果\G后面跟':'则会报"error:no query specified"错误.请知晓. 2. mysql在登陆时,mysql ...

  6. Python3.X与urllib

    在Python3.X中使用urllib时,不能像Python2.X一样直接使用: import urllib response = urllib.urlopen("http://www.ba ...

  7. POJ 1321-棋盘问题(DFS 递归)

    POJ 1321-棋盘问题 K - DFS Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I6 ...

  8. 取消开机window 设备选择

    问题:开机,出现window 设备选择,在win7 页面上会停留几秒.解决方案:win+R 输入 -msconfig 进入引导 把延迟改为3

  9. [BZOJ 1055] [HAOI2008] 玩具取名 【记忆化搜索】

    题目链接:BZOJ - 1055 题目分析 这种类似区间 DP 的记忆化搜索都是很相近的,比如字符串压缩和字符串扩展都差不多. 都是将现在 Solve 的区间分成子区间,再求解子区间. 这道题 Sol ...

  10. 石英晶振频率后面带的PPM是什么单位

    PPM是石英晶振的基本单位之一,表示晶振的精度和相对偏差, PPM代表着百万分之一,它表明晶体的频率可能会偏离标称值多少.晶振频率是以MHZ(10的6次方)和KHZ(10的3次方)为基本单位的,标称频 ...