1.意图

运用共享技术有效地支持大量细粒度的对象。

2.别名

3.动机

有些应用程序得意于在其整个设计过程中採用对象技术,但简单化的实现代价极大。如我们在使用word的时候。假设设置正文字体为:text.setFont(new Font(“細明體”, Style.BOLD, 12));每一个文字我们都须要这样设置,内存太大。并且也非常难记,稍有不注意就会出错。所以通常并非对每一个字符都用一个单独的对象去表示。

Flyweight模式描写叙述了怎样共享对象。是的能够细粒度地使用他们而无需高昂的代价。

4.适用性

Flyweight模式的有效性非常大程度上取决于怎样使用它以及在何处使用它。当下面情况都成立时使用Flyweight模式:

  • 一个应用程序使用了大量的对象
  • 全然因为大量的对象,造成非常大的存储开销
  • 对象的大多数状态都可变为外部状态。
  • 假设删除对象的外部状态,那么能够用相对较少的共享对象代替非常多组对象。
  • 应用程序不依赖于对象标识。因为Flyweight对象能够被共享,对于概念上明显有别的对象,标识測试将返回真值。

5.结构

享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候能够降低内存的开销。通常与工厂模式一起使用。

Structual设计--Flyweight模式_连接池

FlyWeightFactory负责创建和管理享元单元,当一个client请求时。工厂须要检查当前对象池中是否有符合条件的对象,假设有。就返回已经存在的对象。假设没有,则创建一个新对象,FlyWeight是超类。

一提到共享池,我们非常easy联想到Java里面的JDBC连接池,想想每一个连接的特点。我们不难总结出:适用于作共享的一些个对象。他们有一些共同拥有的属性,就拿数据库连接池来说。url、driverClassName、username、password及dbname。这些属性对于每一个连接来说都是一样的。所以就适合用享元模式来处理,建一个工厂类,将上述相似属性作为内部数据,其他的作为外部数据。在方法调用时,当做參数传进来,这样就节省了空间。降低了实例的数量。

看个样例:

Structual设计--Flyweight模式_享元模式_02

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对象。