享元模式
享元模式,是为数不多的只为提升系统性能而生的设计模式。
复用重量级对象。多个线程子类,有个公共的接口管理类。
与对象池不同的是,对象池中的对象都可以相互替代,而享元实例不可以。
享元模式的一个典型应用实例:
SAAS系统中,假定名称为“工资管理系统”(FMR),甲乙丙3个公司,为FMR的3个用户,而每个公司又拥有100名员工。每个员工都可以登录FMR查询自己的收入情况,并且为了系统安全,每个公司都有自己的独立数据库。在这种情况下,我们便可以使用享元模式,为每个公司提供查询接口,而一个公司下所有员工都可以共享相同的查询实例,这样系统只需要3个享元实例,就可以满足300个员工的查询请求。
享元模式的精髓就是使用享元工厂对每个享元实例进行维护。
a.享元对象创建工厂:
package com.zendly.mode.share;
import java.util.Hashtable;
import java.util.Map;
/**
* 享元对象创建工厂
* @author zendly
*/
public class ReportManagerFactroy {
Map<String, IReportManeger> financialReportManager
= new Hashtable<String, IReportManeger>();
IReportManeger getFinancialManeger(String tenantId){
IReportManeger r = financialReportManager.get(tenantId);
if (null==r) {
r = new FinancialReportManager(tenantId);
financialReportManager.put(tenantId, r);
}
return r;
}
}
b.享元对象的接口:
package com.zendly.mode.share;
/**
* 享元对象的接口
* @author zendly
*/
public interface IReportManeger {
public String createReport();
}
c.不同业务类型实例:
package com.zendly.mode.share;
/**
* 不同业务类型实例
* @author zendly
*/
public class FinancialReportManager implements IReportManeger {
protected String tenantId = null;//公司唯一ID
public FinancialReportManager(String tenantId) {
this.tenantId=tenantId;
}
@Override
public String createReport() {
return "This is FinancialReport!";
}
}