Java程序优化之享元模式
享元模式主要目的是為了提高系統(tǒng)性能。它的核心思想是:如果在一個系統(tǒng)中存在多個相同的對象,那么只需要共享一份對象的拷貝,而不必為每一次使用都創(chuàng)建新的對象。享元模式是為數(shù)不多的為提升系統(tǒng)性能而生的設(shè)計模式。
享元模式對性能提升主要有兩點:
1·節(jié)省重復(fù)創(chuàng)建對象的開銷,因為被享元模式維護(hù)的相同對象只會被創(chuàng)建一次,當(dāng)創(chuàng)建對象比較耗時時,便可以節(jié)省大量時間。
2·由于創(chuàng)建的對象變少,所以對系統(tǒng)的內(nèi)存需求也減少,使得GC壓力相應(yīng)降低,使系統(tǒng)有更快的反應(yīng)速度。
享元模式主要角色有四個:享元工廠、抽象享元、具體享元類、主函數(shù)。
享元工廠:用于創(chuàng)建具體享元類,維護(hù)相同的享元對象。保證相同的享元獨享可以被系統(tǒng)共享,當(dāng)請求對象已存在,直接返回對象,不存在則創(chuàng)建對象。
抽象享元:定義共享的對象的業(yè)務(wù)接口。
具體享元:實現(xiàn)抽象享元類的接口,完成具體邏輯。
主函數(shù):通過享元工廠獲得享元對象
享元模式的核心是享元工廠,它需要確保系統(tǒng)可以共享相同的對象,一般情況下,享元工廠會維護(hù)一個對象列表,當(dāng)需要獲得享元對象時,有則直接返回,沒有則創(chuàng)建新的享元對象,并將它添加到隊列中。
以一個人事管理系統(tǒng)為例,三個公司甲、乙、丙是這個系統(tǒng)的用戶,每個公司又有100個員工,每個員工都可以通過系統(tǒng)查詢工資,為了系統(tǒng)安全,每個公司都有自己獨立的數(shù)據(jù)庫。這種情況可以使用享元模式,為每一個公司提供工資查詢接口,一個公司下的所有人共享同一個查詢(因為他們在同一個數(shù)據(jù)庫,可以共享數(shù)據(jù)庫連接),所以只需要三個享元實例,就能應(yīng)對300個查詢請求。
//享元接口類 用于創(chuàng)建報表public interface IReportManager{public String createReport();}復(fù)制代碼兩個報表生成的實例類,分別對應(yīng)員工收入報表和員工個人信息報表,都是享元類
//員工收入報表public class FinanicReportManager implements IReportManager{protected String tenantId = null;public FinanicReportManager(String tenantId){this.tenantId = tenantId;}public String createReport(){return "This is financial report"}}//員工個人信息報表public class EmployeeReportManager implements IReportManager{protected String tenantId = null;public EmployeeReportManager(String tenantId){this.tenantId = tenantId;}public String createReport(){return "This is financial report"}}//核心享元工廠類public class ReportManagerFactory{//創(chuàng)建兩個HashMap來存放實例類Map<String, IReportManager> financialReportManager = new HashMap<String, ????????????????IReportManager>();Map<String, IReportManager> employeeReportManager = new HashMap<String, ???? ????????IReportManager>();IReportManager getFinancialReportManager(String tenantId){IReportManager r = financialReportManager.get(tenantId);//通過ID獲得享元if (r == null) {r = new FinanicReportManager(tenantId); //維護(hù)已創(chuàng)建的享元financialReportManager.put(tenantId, r);}return r;}IReportManager getEmployeeReportManager(String tenantId){IReportManager r = new employeeReportManager.get(tenantId);if (r == null) {r = new EmployeeReportManager(tenantId);employeeReportManager,put(tenantId, r);}return r;}}public static void main(String[] args) {ReportManagerFactory rmf = new ReportManagerFactory();IReportManager rm = rmf.getFinanicReportManager("A");System.out.println(rm.createReport());} 復(fù)制代碼享元工廠以ID為索引,維護(hù)一個享元的集合,確保相同公司的員工請求都返回同一個享元實例,確保享元對象的有效復(fù)用。
轉(zhuǎn)載于:https://juejin.im/post/5cb99e34518825464319adbf
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Java程序优化之享元模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王者荣耀解除关系需要对方同意吗 《王者》
- 下一篇: Java 中的异常和处理详解