简介:享元模式是是设计模式中少有的为提高系统性能为目标的设计模式之一。它的核心思想是:如果系统中存在多个相同的对象,那么只需创建共享的一份对象的拷贝,而不必为每一次使用都创建新的对象。
优点:
1)可以节省重复创建对象的开销,被享元模式维护的相同对象只会被创建一次。
2)创建的对象数量减少,所以对系统的内存减少,GC压力降低。
1.涉及到的角色
1)享元工厂:用于创建具体享元类,维护相同的享元对象。它保证相同的享元对象可以被系统共享。即,其内部使用了类似单例模式的算法,当请求对象已经存在时,直接返回对象,不存在时,再创建对象。
2)抽象享元 :定义需共享的对象的业务接口。
3)具体享元类:实现抽象享元的接口,完成某一具体的逻辑。
4)Main:使用享元模式的组件,通过享元工厂取得享元对象
2.抽象享元
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()); } }