讲享元设计模式,顺便~学会了数据库连接池,

设计模式-详细说明享元模式设计,保准一听就会,不会你来打我

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;
    }

    @Override
    public void commit() {
        // 模拟提交
    }

    @Override
    public void rollback() {
        // 模拟回滚
    }

    @Override
    public 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 List<Connection> activeConnectionPool = new ArrayList<>();
    protected final List<Connection> idleConnectionPool = new ArrayList<>();


    @Override
    public 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 {

    @Override
    public DataSource getDataSource() {
        return new PooledDatasource();
    }
}

单元测试:

怎么样,其实还是蛮简单的,大家可以打断点调试下就都明白啦。

/**
 * @Author df
 * @Description: 测试享元模式
 * @Date 2024/3/2 17:12
 */
public class TestApi {
    @Test
    public void test_flyweight() {
        // 实例化数据源工厂
        DatasourceFactory datasourceFactory = new PooledDatasourceFactory();
        // 通过工厂获取数据源
        DataSource datasource = datasourceFactory.getDataSource();
        // 通过数据源获取连接
        Connection connection = datasource.getConnection();
        // 连接关闭
        connection.close();

        // 再次获取连接
        Connection connection1 = datasource.getConnection();
        //connection.close();
    }
}

  • 29
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值