喵星之旅-沉睡的猫咪-享元模式

 

一、享元是什么?

享元模式是对象池的一种实现。类似于线程池,线程池。可以避免不停的创建和销毁多个对象,消耗性能。其宗旨是共享细粒度对象,将多个对同一对象的访问集中起来,不必为每个访问者创建一个单独的对象,以此来降低内存的消耗,属于结构型模式

可以认为是提供了缓存功能的工厂模式,但是关注点不是如何创建对象,而是共享。


二、如何实现享元,及示例

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

posted @ 2020-03-10 17:53  喵星兔  阅读(123)  评论(0编辑  收藏  举报