核心思想
如果在一个系统中存在多个相同的对象, 那么只需共享一份对象的拷贝, 而不必为每一次使用都创建新的对象.
好处
- 可以节省重复创建对象的开销
- 由于创建的对象较少,所以对系统内存的需求也减少,使得GC的压力也相应降低
代码
- 创建接口
public interface IReportManager {
public String createReport();
}
- 接口的实现类
public class EmployeeReportManager implements IReportManager{
protected String tenantId = null;
public EmployeeReportManager(String tenantId) {
this.tenantId = tenantId;
}
public String createReport() {
return "This is a employee report";
}
}
public class FinancialReportManager implements IReportManager{
protected String tenantId = null;
public FinancialReportManager(String tenantId) {
this.tenantId = tenantId;
}
public String createReport() {
return "This is a financial report";
}
}
- 享元工厂
public class ReportManagerFactory {
Map<String, IReportManager> financialReportManager = new HashMap<String, IReportManager>();
Map<String, IReportManager> employeeReportManager = new HashMap<String, IReportManager>();
IReportManager getFinancialReportManager(String tenantId){
IReportManager r = financialReportManager.get(tenantId);
if(r == null){
r = new FinancialReportManager(tenantId);
financialReportManager.put(tenantId, r);
}
return r;
}
}
- 测试类
public class Main {
public static void main(String[] args) {
ReportManagerFactory rmf = new ReportManagerFactory();
IReportManager financialReportManager = rmf.getFinancialReportManager("A");
String createReport = financialReportManager.createReport();
System.out.println(createReport);
}
}
理解
- 其实享元模式可以看成是单例模式的一中扩展,
- 在享元工厂中维护多个对象实例, 不同实例分工是不同的. 同一对象实例可以当成是对象池理解
网友评论