喵星之旅-沉睡的猫咪-享元模式
一、享元是什么?
享元模式是对象池的一种实现。类似于线程池,线程池。可以避免不停的创建和销毁多个对象,消耗性能。其宗旨是共享细粒度对象,将多个对同一对象的访问集中起来,不必为每个访问者创建一个单独的对象,以此来降低内存的消耗,属于结构型模式。
可以认为是提供了缓存功能的工厂模式,但是关注点不是如何创建对象,而是共享。
二、如何实现享元,及示例
1、确定享元的元,也就是对象。需要定义接口和实现类。我们这里选择数据库连接对象,所以就不创建了。
2、创建享元工厂。应该提供创建对象、缓存对象等功能。取出数据时,池内没有该数据,使用万要放回池内。
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、测试类
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); } }
三、享元要注意什么
享元模式 同样要求创建一个或一组对象,并且就是通过工厂方法生成对象的,只不过享元模式中为工厂方法增加了缓存这一功能。
享元对象应当包含内部状态和外部状态。内部状态是共享的,外部状态不是,内部状态是一直保持不变的。
以网吧的电脑为例,开机后出现一些变化:我们会有登录网站、软件信息等,计算机变成不可被别人使用状态,这些都是外部状态,然后下一次又回还原回去。对于计算机的配置等,都是一成不变的,也就是内部状态。
享元对象取出前或者叫回收后,处于可以背使用状态时,应该把上次使用时产生的信息删除,也就是外部状态初始化。
ps:项目地址 svn://47.105.188.20/kitty/2%E3%80%81code/pattern 用户名密码:reader/reader
作者:喵星兔
出处:https://www.cnblogs.com/kittybunny/
喵星之旅:https://www.cnblogs.com/kittybunny/p/12148641.html
我的视频:https://space.bilibili.com/518581788
更多内容:不咬人的小兔子
本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。
我是兔子,我会喵,我叫喵星兔~~