享元模式(Flyweight)
享元模式是一种结构型模式,它主要用于减少创建对象的数量,减少内存占用。通过重用现有对象的方式,如果未找到匹配对象则新建对象。线程池、数据库连接池、常量池等池化的思想就是享元模式的一种应用。
图解
角色
- 享元工厂:负责创建和管理享元对象,通常包含一个池用于存储和复用已经创建的享元对象
- 具体享元:实现抽象元接口,包含内部和外部状态,内部状态可被分享,外部状态由客户端传递
- 抽象享元:定义具体享元和非共享享元接口,通常包含设置外部状态的方法
- 客户端:使用享元工厂获取享元对象,并通过设置外部状态来操作享元对象。客户端通常不需要关心享元对象的具体实现
代码实现
抽象享元
java
public interface Connection {
void get();
}
具体享元
java
public class JdbcConnection implements Connection{
private String id;
public JdbcConnection(String id) {
this.id = id;
}
@Override
public void get() {
System.out.println("连接ID为:" + this.id);
}
}
享元工厂
java
public class JdbcConnectionFactory {
List<Connection> list = new ArrayList<>();
private int count = 5;
private Random random = new Random();
public Connection getConnection(){
if(list.size() < count){
JdbcConnection jdbcConnection = new JdbcConnection(UUID.randomUUID().toString());
list.add(jdbcConnection);
return jdbcConnection;
}else {
int i = random.nextInt(4);
return list.get(i);
}
}
}
客户端
java
public class Test {
public static void main(String[] args) {
JdbcConnectionFactory jdbcConnectionFactory = new JdbcConnectionFactory();
for (int i = 0; i < 6; i++) {
Connection connection = jdbcConnectionFactory.getConnection();
connection.get();
}
}
}
shell
连接ID为:406ba526-7a07-41e4-9a4d-6df479aa9bce
连接ID为:f9bc31c7-77d0-4a4f-90b2-166e9656c9ac
连接ID为:81e52b30-7c49-4ffa-b6bb-dd3c0863d0b4
连接ID为:bd124c69-db5e-4a84-a9ee-1ba56fc12990
连接ID为:f953b8fd-ac5c-4988-9fec-b7660669700e
连接ID为:bd124c69-db5e-4a84-a9ee-1ba56fc12990
最多产生五个连接对象