享元模式()
图中ReportManagerFactory为享元工厂负责创建具体的报表工具它确保每个公司(租户)下所有的员工都共享一个具体的享元实例(FinancialReportManager或者EmployeeReportManager)这样当公司甲的两个员工登录进行财务查询时系统不必为两个员工都新建FinancialReportManager而可以让他们共享一个FinancialReportManager实例
通过这个示例还可以进一步了解享元工厂和对象池的一个重要区别在一个对象池中所有的对象都是等价的任意两个对象在任何使用场景中都可以被对象池中的其他对象代替而在享元模式中享元工厂所维护的所有对象都是不同的任何两个对象间不能相互代替如本例中为公司甲创建的FinancialReportManagerA和为公司乙创建的FinancialReportManagerB分别对应了后台各自不同的数据库因此两者是不可相互替代的
注意享元模式和对象池的最大不同在于享元对象是不可相互替代的它们各自都有各自的含义和用途而对象池中的对象都是等价的如数据库连接池中的数据库连接
本例中享元对象接口的实现如下它用于创建一个报表即所有的报表生成类将作为享元对象在一个公司(租户)中共享
public interface IReportManager {
public String createReport()
}
以下是两个报表生成的实例分别对应员工财务收入报表和员工个人信息报表它们都是具体的享元类
public class FinancialReportManager implements IReportManager {//财务报表
protected String tenantId=null;
public FinancialReportManager(String tenantId){ //租户ID
thistenantId=tenantId;
}
@Override
public String createReport() {
return This is a financial report;
}
}
public class EmployeeReportManager implements IReportManager { //员工报表
protected String tenantId=null;
public EmployeeReportManager(String tenantId){ //租户ID
thistenantId=tenantId;
}
@Override
public String createReport() {
return This is a employee report;
}
}
最为核心的享元工厂类实现如下它也是享元模式的精髓所在它确保同一个公司(租户)使用相同的对象产生报表这是相当有意义的否则系统可能会为每个员工生成各自的报表对象导致系统开销激增
[] []