享元模式是設計模式中少數幾個以調高系統性能為目的的設計模式。它的核心思想是:如果在一個系統中存在多個相同的對象,那么只需共享一份對象的拷貝,而不必為每一次使用都創建新的對象。在享元模式中,由于需要構建和維護這些可以共享的對象,因此,常常會出現一個工廠類,用于維護和創建對象。
享元模式對性能提升的主要幫助有兩點:
1.可以節省重復創建對象的開銷,因為被享元模式維護的相同對象只會被創建一次,當對象創建比較耗時時,便可以節省大量時間;
2.由于創建對象的數量減少,所有對系統內存的需求也減少,這樣使GC的壓力也相應的降低,進而使系統擁有一個更健康的內存結構和更快的反應速度。
享元模式主要有享元工廠、抽象享元、具體享元和主函數幾部分構成。各部分功能如下:

享元工廠是享元模式的核心,它需要確保系統可以共享相同的對象。享元模式的主要作用是復用大對蝦(重量級對象),以減省內存空間和創建時間。享元模式的主要應用是SAAS系統(software as a service)。
抽象享元:
1 public interface IReportManager {2 public String createReport();3 }
具體享元:
1 public class EmployeeReportManager implements IReportManager { 2 3 PRivate String tenantId = null; 4 5 6 7 public EmployeeReportManager(String tenantId) { 8 this.tenantId = tenantId; 9 System.out.println("EmployeeReportManager.EmployeeReportManager()");10 }11 12 13 14 @Override15 public String createReport() {16 return "This is a employee report";17 }18 19 }
public class FinancialReportManager implements IReportManager{ private String tenantId = null; public FinancialReportManager(String tenantId) { this.tenantId = tenantId; System.out.println("FinancialReportManager.FinancialReportManager()"); } @Override public String createReport() { return "This is a financial report"; } }
享元工廠:
1 public class ReportManagerFactory { 2 private Map<String,IReportManager> financialReportManager = new HashMap<String,IReportManager>(); 3 private Map<String,IReportManager> employeeReportManager = new HashMap<String,IReportManager>(); 4 5 public IReportManager getFinancialReportManager(String tenantId){ 6 IReportManager iReportManager = financialReportManager.get(tenantId); 7 if(iReportManager==null){ 8 iReportManager = new FinancialReportManager(tenantId); 9 }10 return iReportManager;11 }12 13 public IReportManager getEmployeeReportManager(String tenantId){14 IReportManager iReportManager = financialReportManager.get(tenantId);15 if(iReportManager==null){16 iReportManager = new FinancialReportManager(tenantId);17 }18 return iReportManager;19 }20 21 }
main方法:
1 public class TestClient { 2 3 public static void main(String[] args) { 4 ReportManagerFactory rmf = new ReportManagerFactory(); 5 IReportManager rm = rmf.getEmployeeReportManager("1233"); 6 rmf.getEmployeeReportManager("1233"); 7 System.out.println(rm.createReport()); 8 } 9 10 }
另外,享元模式與對象池最大的區別就是,享元模式是不可相互替代的,他們各自有各種的含義和用途,而對象池中的對象是等價的,可以相互替換,如數據庫連接池中的數據庫連接。
新聞熱點
疑難解答