简介:享元模式是是设计模式中少有的为提升系统性能为目标的设计模式之一。它的核心思想是:若是系统中存在多个相同的对象,那么只需建立共享的一份对象的拷贝,而没必要为每一次使用都建立新的对象。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()); } }