喵星之旅-沉睡的猫咪-享元模式

一、享元是什么?

享元模式是对象池的一种实现。类似于线程池,线程池。可以避免不停的创建和销毁多个对象,消耗性能。其宗旨是共享细粒度对象,将多个对同一对象的访问集中起来,不必为每个访问者创建一个单独的对象,以此来降低内存的消耗,属于结构型模式。

可以认为是提供了缓存功能的工厂模式,但是关注点不是如何创建对象,而是共享。

二、如何实现享元,及示例

1、确定享元的元,也就是对象。需要定义接口和实现类。我们这里选择数据库连接对象,所以就不创建了。

2、创建享元工厂。应该提供创建对象、缓存对象等功能。取出数据时,池内没有该数据,使用万要放回池内。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package structure.flyweight;

import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Vector;

/**
*
* @author bunny~~我是兔子我会喵,我叫喵星兔。
*
*/
public class ConnectionPool {
private Vector<Connection> pool;
private int pollSize = 100;
private String url = "jdbc:mysql://localhost:3306/";
private String username = "root";
private String password = "123456";
private String driveclassName = "com.mysql.jdbc.Driver";

public ConnectionPool() {
pool = new Vector<Connection>(pollSize);
for (int i = 0; i < pollSize; i++) {
try {
Class.forName(driveclassName);
Connection connection = DriverManager.getConnection(url, username, password);
pool.add(connection);
} catch (Exception e) {
e.printStackTrace();
}

}
}

public synchronized Connection getConncetion() {
if (pool.size() > 0) {
Connection connection = pool.get(0);
pool.remove(connection);
return connection;
}
return null;
}

public synchronized void release(Connection c) {
pool.add(c);

}
}

3、测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package structure.flyweight;

import java.sql.Connection;
/**
*
* @author bunny~~我是兔子我会喵,我叫喵星兔。
*
*/
public class Test {

public static void main(String[] args) {
ConnectionPool p = new ConnectionPool();
Connection c = p.getConncetion();
System.out.println(c);

}

}

三、享元要注意什么

享元模式 同样要求创建一个或一组对象,并且就是通过工厂方法生成对象的,只不过享元模式中为工厂方法增加了缓存这一功能。

享元对象应当包含内部状态和外部状态。内部状态是共享的,外部状态不是,内部状态是一直保持不变的。

以网吧的电脑为例,开机后出现一些变化:我们会有登录网站、软件信息等,计算机变成不可被别人使用状态,这些都是外部状态,然后下一次又回还原回去。对于计算机的配置等,都是一成不变的,也就是内部状态。

享元对象取出前或者叫回收后,处于可以背使用状态时,应该把上次使用时产生的信息删除,也就是外部状态初始化。

文章目录
  1. 一、享元是什么?
  2. 二、如何实现享元,及示例
    1. 1、确定享元的元,也就是对象。需要定义接口和实现类。我们这里选择数据库连接对象,所以就不创建了。
    2. 2、创建享元工厂。应该提供创建对象、缓存对象等功能。取出数据时,池内没有该数据,使用万要放回池内。
    3. 3、测试类
  3. 三、享元要注意什么
|