`
阅读更多

享元模式

    享元模式,是为数不多的只为提升系统性能而生的设计模式。

    复用重量级对象。多个线程子类,有个公共的接口管理类。

    与对象池不同的是,对象池中的对象都可以相互替代,而享元实例不可以。

 

    享元模式的一个典型应用实例:

    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!";
	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics