背景
在此之前,本人曾经写过两篇总结文章,《封装一个FTP工具类》和《使用commons-pool管理FTP连接》,相应地造了两个小项目轮子。两个项目之间有相同点,也有不同的侧重点:都是使用commons-net和commons-pool库构建的,前者最大的特点是使用了模板方法设计模式,借鉴了JdbcTemplate的实现,造了上传下载工具类方法;后者最大的特点是使用AutoCloseable的方式去设计FTP连接(FTPConnection),借鉴的是BasicDataSource的实现,重点是连接的管理重用。
第一个项目的问题是和Spring绑定了,且底层使用了KeyObjectPool模式,实现上比较简陋,不利于扩展;第二个项目倒不是存在很大的问题,只是不够简洁,还有改进的空间,但是由于一开始设计时上考虑太多,束缚了自己,项目无法演进。不难看出,本人关心的是项目的扩展性,在项目上能不能实践一些知识点,是一种练笔的心态;因此,姑且将这个新轮子取名ftpcp2;
重构
本次重构的想法酝酿了很久了,总结过去的经验教训,这次重构本着一种alpha的心态,保持代码思路简洁,一点点地加功能,没有考虑API是否稳定,将近一个月的时间收获不少,一些是关于代码架构设计的,一些是关于工具链的;
架构思路
设计一个Manager类,底层是一个连接池,能够返回一个封装后的Client对象,这个Client对象close时并不是真正的关闭连接,而是回收到连接池,