享元模式:运用共享技术有效地支持大量细的对象,可以避免大量非常相似的开销。
在程序设计中,有时需要生成大量细度的类实例来表示数据。如果发现这些实例除了几个参数外基本上都是相同的。有时就能够受大幅度得减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时讲它们传递进来,就可以通过共享大幅度地减少单个实例的数目。
package com.jerry.design.flyweight;
abstract class Conn {
public abstract void getConn();
}
package com.jerry.design.flyweight;
import java.util.HashMap;
import java.util.Map;
public class ConnFactory {
private Map<String, Conn> ConnPool = new HashMap<String, Conn>();
private static ConnFactory connFactory = new ConnFactory();
private ConnFactory() {
}
public static ConnFactory getInstance() {
return connFactory;
}
public Conn addConn(String name) {
Conn conn = null;
if (ConnPool.containsKey(name)) {
conn = ConnPool.get(name);
} else {
conn = new JdbcConn(name);
ConnPool.put(name, conn);
}
return conn;
}
public int getTotal() {
return ConnPool.size();
}
}
package com.jerry.design.flyweight;
public class JdbcConn extends Conn {
public String name;
public JdbcConn(String name) {
this.name = name;
}
@Override
public void getConn() {
System.out.println("创建了一个" + name + "的jdbc连接。");
}
}
package com.jerry.design.flyweight;
import java.util.ArrayList;
import java.util.List;
// 测试类
public class Test {
private static List<Conn> conns = new ArrayList<Conn>();
private static ConnFactory connFactory;
// 增加订单
private static void takeOrders(String name) {
conns.add(connFactory.addConn(name));
}
public static void main(String[] args) {
connFactory = ConnFactory.getInstance();
// 增加连接
takeOrders("Oracle");
takeOrders("sql server");
takeOrders("postgrep");
takeOrders("mysql");
takeOrders("mysql");
takeOrders("db2");
takeOrders("Oracle");
takeOrders("Oracle");
takeOrders("db2");
takeOrders("sql server");
takeOrders("postgrep");
takeOrders("db2");
takeOrders("sql server");
takeOrders("sql server");
takeOrders("postgrep");
for (Conn conn : conns) {
conn.getConn();
}
System.out.println("一共创建了 " + conns.size() + " 个连接! ");
System.out.println("共生成了 " + connFactory.getTotal()
+ " 个Conn对象! ");
}
}