描述
主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用
 适用
管理数据库连接池的类
 其他
Pool负责创建和管理享元单元,当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象,FlyWeight是超类。一提到共享池,我们很容易联想到Java里面的JDBC连接池,想想每个连接的特点,我们不难总结出:适用于作共享的一些个对象,他们有一些共有的属性,就拿数据库连接池来说,url、driverClassName、username、password及dbname,这些属性对于每个连接来说都是一样的,所以就适合用享元模式来处理,建一个工厂类,将上述类似属性作为内部数据,其它的作为外部数据,在方法调用时,当做参数传进来,这样就节省了空间,减少了实例的数量。
 示例
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 
 | class Pool{private Vector<Connection> pool;
 
 private String url = "数据流链接地址";
 private String username = "用户名";
 private String password = "密码";
 private String dirverClassName = "驱动类名称";
 
 private int size = 100;
 private static Pool instance = null;
 Connection conn = null;
 
 
 private Pool(){
 pool = new Vector<Connection>(size);
 for (int i=0; i<size; i++){
 try{
 Class.forName(dirverClassName);
 conn = DriverManager.getConnection(url, username, password);
 pool.add(conn);
 } catch (ClassNotFoundException e){
 e.printStackTrace();
 } catch (SQLException e){
 e.printStackTrace();
 }
 }
 }
 
 public synchronized void release(){
 pool.add(conn);
 }
 
 public synchronized Connection getConnection(){
 if (pool.size() > 0 ){
 Connection conn = pool.get(0);
 pool.remove(conn);
 return conn;
 } else {
 return null;
 }
 }
 }
 
 |