簡介:享元模式是是設計模式中少有的爲提升系統性能爲目標的設計模式之一。它的核心思想是:若是系統中存在多個相同的對象,那麼只需建立共享的一份對象的拷貝,而沒必要爲每一次使用都建立新的對象。java
優勢:算法
1)能夠節省重複建立對象的開銷,被享元模式維護的相同對象只會被建立一次。設計模式
2)建立的對象數量減小,因此對系統的內存減小,GC壓力下降。性能
1.涉及到的角色this
1)享元工廠:用於建立具體享元類,維護相同的享元對象。它保證相同的享元對象能夠被系統共享。即,其內部使用了相似單例模式的算法,當請求對象已經存在時,直接返回對象,不存在時,再建立對象。spa
2)抽象享元 :定義需共享的對象的業務接口。設計
3)具體享元類:實現抽象享元的接口,完成某一具體的邏輯。code
4)Main:使用享元模式的組件,經過享元工廠取得享元對象對象
2.抽象享元 blog
IReportManager.java
package com.hxc.Share; /** * <p>Description: 抽象享元</p> * @author Huang Xiaocong * @data 2019年10月31日 */ public interface IReportManager { public String createReport(); }
3.享元工廠
ReportManagerFactory.java
package com.hxc.Share; import java.util.HashMap; import java.util.Map; /** * <p>Description: 享元工廠</p> * @author Huang Xiaocong * @data 2019年10月31日 */ public class ReportManagerFactory { private Map<String, IReportManager> companyAReport = new HashMap<String, IReportManager>(); private Map<String, IReportManager> companyBReport = new HashMap<String, IReportManager>(); public IReportManager getCompanyAReport(String tenanId) { IReportManager reportManager = companyAReport.get(tenanId); if(reportManager == null) { reportManager = new CompanyAReport(tenanId); } return reportManager; } public IReportManager getCompanyBReport(String tenanId) { IReportManager reportManager = companyBReport.get(tenanId); if(reportManager == null) { reportManager = new CompanyBReport(tenanId); } return reportManager; } }
4.具體享元類
CompanyAReport.java CompanyBReport.java
package com.hxc.Share; /** * <p>Description: 具體享元A</p> * @author Huang Xiaocong * @data 2019年10月31日 */ public class CompanyAReport implements IReportManager { private String tenanId; public CompanyAReport(String tenanId) { this.tenanId = tenanId; } public String createReport() { return "create company A report " + tenanId; } }
package com.hxc.Share; /** * <p>Description: 具體享元B</p> * @author Huang Xiaocong * @data 2019年10月31日 */ public class CompanyBReport implements IReportManager { private String tenanId; public CompanyBReport(String tenanId) { this.tenanId = tenanId; } public String createReport() { return "create company B report " + tenanId; } }
5.Main
package com.hxc.Share; public class Main { public static void main(String[] args) { ReportManagerFactory factory = new ReportManagerFactory(); IReportManager companyAReport = factory.getCompanyAReport("A1101"); System.out.println(companyAReport.createReport()); IReportManager companyBReport = factory.getCompanyBReport("B2222"); System.out.println(companyBReport.createReport()); } }