享元模式()
圖中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;
}
}
最為核心的享元工廠類實現如下它也是享元模式的精髓所在它確保同一個公司(租戶)使用相同的對象產生報表這是相當有意義的否則系統可能會為每個員工生成各自的報表對象導致系統開銷激增
[] []
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27825.html