享元模式

当以下的所有条件都满足时,可以考虑使用:

1 一个系统有大量的对象

2 这些对象耗费大量的内存

3 这些对象的状态中的大部分都可以外部化

4 这些对象按照内蕴状态分成很多组,当把外蕴对象从对象中剔除时,每一个组都可以仅用一个对象代替

5 软件系统不依赖与这些对象的身份,换言之,这些对象时不可分辨的

核心思想:如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不必每一次使用都创建新的对象

 有别于对象池(如数据库线程池,存放的对象都是等价的,而享元对象时不可互相替代的)


package org.test.WeightFactory;
//抽象享元
public interface IReportManager {
	String createReport();
}


package org.test.WeightFactory;
//具体享元类1
public class FinancialReportManager implements IReportManager {
	protected String tenanId = null;
	
	public FinancialReportManager(String tenanId) {
		this.tenanId = tenanId;
	}

	@Override
	public String createReport() {
		// TODO Auto-generated method stub
		return "financial report manager";
	}

}

package org.test.WeightFactory;
//具体享元对象2
public class EmployeeReportManager implements IReportManager {
	protected String tenanId = null;
	
	
	public EmployeeReportManager(String tenanId) {
		this.tenanId = tenanId;
	}


	@Override
	public String createReport() {
		
		return "employee report manager";
	}

}

package org.test.WeightFactory;
//享元工厂
import java.util.HashMap;
import java.util.Map;

public class ReportFactory {
	Map<String , IReportManager> employeeReportManager = new HashMap<String,IReportManager>();
	Map<String , IReportManager> finanacialReportManager = new HashMap<String,IReportManager>();
	
	public IReportManager getEmployReport(String tenanId){
		IReportManager r = finanacialReportManager.get(tenanId);
		if (r == null){
			r = new FinancialReportManager(tenanId);
			finanacialReportManager.put(tenanId,r);
		}
		return r;
	}
	public IReportManager getFinancialReport(String tenanId){
		IReportManager r = employeeReportManager.get(tenanId);
		if (r == null){
			r = new FinancialReportManager(tenanId);
			employeeReportManager.put(tenanId,r);
		}
		return r;
	}
}

package org.test.WeightFactory;
//test
public class Demo {
	public static void main(String[] args) {
		ReportFactory fc = new ReportFactory();
		IReportManager rm = fc.getEmployReport("hehe");
		System.out.println(rm.createReport());
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值