企业网站建设的基本标准是,广告公司运作模式,破解网站后台密码,学做网站容易吗设计模式-详细说明享元模式设计#xff0c;保准一听就会#xff0c;不会你来打我 1.前言
今天呢#xff0c;我们来说下享元模式#xff0c;享元模式是结构型模式#xff0c;我的感觉#xff0c;结构型模式都是相对比较简单的设计模式#xff0c;这个也是#xff0c;之… 设计模式-详细说明享元模式设计保准一听就会不会你来打我 1.前言
今天呢我们来说下享元模式享元模式是结构型模式我的感觉结构型模式都是相对比较简单的设计模式这个也是之前手写Mybatis时有学习了解数据库连接池的设计非常精彩其中就运用了咱们这节说的设计模式享元模式。
2.什么是享元模式
享元模式 对一些共享对象进行复用的思想这样减少内存使用提高资源性能像我们使用redis进行缓存处理的线程池数据源连接池都是享元模式享元模式其实是一个思想一般会和工厂模式或其他经常使用的设计模式搭配使用。
那根据这种设计理念我们自己实现个数据库连接池当然是伪代码哈毕竟数据库连接池的业务比较庞大和复杂我们这个就是简单实现但也能够让你理解到数据库连接池的代码设计和思路。
之所以选择数据库连接池的原因是数据库连接池使用是连接连接的创建会有很大消耗所以就出现个池子作共享操作谁用谁从池子里取连接不用了就送回池子里所以这是个典型的享元模式设计思想。
3.代码设计
因为我们知道数据库连接池最主要有连接还有数据源以及数据源工厂那么用户可以通过数据源工厂连接数据源根据数据源获取连接。
3.1 Connection
首先我们定义连接接口Connection定义连接的提交、回滚、关闭方法。
import java.sql.SQLException;/*** Author df* Description:* Date 2024/3/2 16:05*/
public interface Connection {void commit();void rollback();void close();
}然后就是连接的实现DefaultConnection实现Connection接口回滚和提交就不写代码了因为说的是数据库连接池连接池的处理会有创建连接和回收连接那么什么时候回收连接呢就是连接关闭的时候所以在关闭连接的方法里我们调用了回收连接pooledDatasource.pushConnection(this);
由于连接池需要在池数据源里操作所以我们需要通过构造方法把PooledDatasource传入进来这样回收连接时可以调用PooledDatasource的回收方法。代码如下
/*** Author df* Description:* Date 2024/3/2 16:31*/
public class DefaultConnection implements Connection {private PooledDatasource pooledDatasource;public DefaultConnection(PooledDatasource pooledDatasource) {this.pooledDatasource pooledDatasource;}Overridepublic void commit() {// 模拟提交}Overridepublic void rollback() {// 模拟回滚}Overridepublic void close() {pooledDatasource.pushConnection(this);}
}3.2 DataSource
接着我们在定义数据源接口DataSource定义获取连接方法。
/*** Author df* Description: 数据源接口* Date 2024/3/2 16:19*/
public interface DataSource {Connection getConnection();
}然后重点来了定义有池化的数据源然后实现DataSource接口
1.这里首先我们定义了两个全局变量activeConnectionPool活跃连接池列表和idleConnectionPool空闲连接池列表字如其意一个放活跃连接状态的连接一个放空闲状态的连接在用户获取连接时就是活跃的不使用关闭连接就是空闲的。
2.在获取连接时先获取空闲连接池里有连接没如果有直接取出来返回并删除列表这个连接即可如果没有空闲连接则创建连接创建连接以后放入活跃连接池中。
3.pushConnection回收连接方法当关闭连接调用到这里时把当前连接从活跃连接池移除然后放入空闲连接池里。当然真实的肯定是要更复杂的如果大家感兴趣呢可以去我的博客Mybatis专栏或者B站去看啦。 手写Mybatis五-全网最详细的讲解数据源连接池内容有点长关注不迷路不会你打我_哔哩哔哩_bilibili /*** Author df* Description: 有池化资源* Date 2024/3/2 16:22*/
public class PooledDatasource implements DataSource {protected final ListConnection activeConnectionPool new ArrayList();protected final ListConnection idleConnectionPool new ArrayList();Overridepublic Connection getConnection() {if (!idleConnectionPool.isEmpty()) {return idleConnectionPool.remove(0);}// 模拟获取连接Connection connection new DefaultConnection(this);activeConnectionPool.add(connection);return connection;}protected void pushConnection(Connection connection) {// 移除活跃池activeConnectionPool.remove(connection);// 放入空闲池idleConnectionPool.add(connection);}
}3.3 DatasourceFactory
连接接口有啦数据源接口有啦那现在就差个入口啦我们定义数据源工厂接口DatasourceFactory定义的获取数据源方法就OK啦。 /*** Author df* Description: 数据源工厂接口* Date 2024/3/2 17:08*/
public interface DatasourceFactory {DataSource getDataSource();
}然后池化数据源工厂PooledDatasourceFactory实现DatasourceFactory接口再获取数据源的时候实例化有池化数据源。
/*** Author df* Description: 池化数据源工厂* Date 2024/3/2 17:07*/
public class PooledDatasourceFactory implements DatasourceFactory {Overridepublic DataSource getDataSource() {return new PooledDatasource();}
}单元测试
怎么样其实还是蛮简单的大家可以打断点调试下就都明白啦。
/*** Author df* Description: 测试享元模式* Date 2024/3/2 17:12*/
public class TestApi {Testpublic void test_flyweight() {// 实例化数据源工厂DatasourceFactory datasourceFactory new PooledDatasourceFactory();// 通过工厂获取数据源DataSource datasource datasourceFactory.getDataSource();// 通过数据源获取连接Connection connection datasource.getConnection();// 连接关闭connection.close();// 再次获取连接Connection connection1 datasource.getConnection();//connection.close();}
}