欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

享元模式

程序员文章站 2022-05-05 08:27:32
...

享元模式

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

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

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

 

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

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