当以下的所有条件都满足时,可以考虑使用:
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());
}
}