概念
核心思想:系統(tǒng)中存在多個(gè)相同的對(duì)象铺厨,那么就共享一份對(duì)象的拷貝,不必為每一次使用都創(chuàng)建新的對(duì)象硬纤,需要一個(gè)工廠類來(lái)維護(hù)和創(chuàng)建對(duì)象
作用
1.節(jié)省重復(fù)創(chuàng)建對(duì)象的開(kāi)銷
2.創(chuàng)建對(duì)象的數(shù)量減少解滓,對(duì)系統(tǒng)內(nèi)存的需求也減小了
組成圖
享元模式.png
舉例
eg. 以人事管理系統(tǒng)的SAAS軟件系統(tǒng)為例,假設(shè)公司甲筝家、乙洼裤、丙均為SAAS系統(tǒng)的用戶,則定義每個(gè)公司為這套系統(tǒng)中的一個(gè)租戶溪王。每個(gè)公司(租戶)又各自有100個(gè)員工腮鞍,如果這些公司的所有員工都可以登錄這套系統(tǒng)查看自己的收入情況,為了系統(tǒng)安全莹菱,每個(gè)公司(租戶)都擁有自己獨(dú)立的數(shù)據(jù)庫(kù)移国。這種情況下就需要使用享元模式為每個(gè)租戶分別提供一個(gè)工資查詢接口,而每個(gè)公司(租戶)下的所有員工可以共享一個(gè)查詢
代碼
public interface IReportManager {
public String createReport();
}
public class FinancialReportManager implements IReportManager {
private String tenantId = null;
public FinancialReportManager(String tenantId) {
this.tenantId = tenantId;
}
@Override
public String createReport() {
// TODO Auto-generated method stub
return "This is a financial report--------"+tenantId;
}
}
public class ReportManagerFactory {
HashMap<String, IReportManager> reportManagerMap = new HashMap<>();
public IReportManager getReportManager(String keyId){
IReportManager reportManager = reportManagerMap.get(keyId);
if(reportManager == null){
reportManager = new FinancialReportManager(keyId);
reportManagerMap.put(keyId, reportManager);
}
return reportManager;
}
public static void main(String[] args) {
ReportManagerFactory rmf = new ReportManagerFactory();
IReportManager rm = rmf.getReportManager("a");
System.out.println(rm.createReport());
}
}