1、定義java
定義:提供了減小對象數量從而改善應用所需的對象結構的方式(減小對象的建立,減小內存的佔用,提供性能)設計模式
運用共享技術有效地支持大量細粒度的對象安全
類型:結構型dom
2、適用場景ide
一、經常應用於系統底層的開發,以便解決系統的性能問題。性能
二、系統有大量類似對象、須要緩衝池的場景測試
3、優勢this
減小對象的建立,下降內存中對象的數量,下降系統的內存,提升效率線程
減小內存以外的其餘資源佔用(如New對象建立須要時間的減小)設計
4、缺點
關注內/外部狀態、關注線程安全問題
使系統、程序的邏輯複雜化
5、擴展
一、內部狀態
在享元對象的內部,而且不會隨着環境的改變而改變的共享部分。
2.外部狀態
在享元對象的外部,隨着環境改變而改變的
6、相關設計模式
一、享元模式和代理模式
若是生成的代理類,生成和花費的時間比較多,那麼可使用享元模式提升程序的處理速度。
7、Codeing(場景:領導要求部門經理作報告)
1. 建立Employee 接口
public interface Employee { void report(); }
2. 建立Manager 類
public class Manager implements Employee { private String department; private String reportContent; //頭銜 private String title = "部門經理"; public Manager(String department) { this.department = department; } public void setReportContent(String reportContent) { this.reportContent = reportContent; } @Override public void report() { System.out.println(reportContent); } }
這裏department依賴外部傳入,也就是外部狀態。
title是頭銜,不會改變,也就是內部狀態。
3.建立EmployeeFactory 工廠類。裏面有一個內部容器EMPLOYEE_MAP 。 若是沒有建立Manager實例,則建立,並保存在EMPLOYEE_MAP 。
若是已經建立,則在EMPLOYEE_MAP 中取出。
public class EmployeeFactory { private static final Map<String, Employee> EMPLOYEE_MAP = new HashMap<>(); public static Employee getManager(String department){ Manager manager = (Manager) EMPLOYEE_MAP.get(department); if(manager == null){ manager = new Manager(department); System.out.print("建立部門經理:" + department); String reportConent = department + ":這次報告的內容是。。。"; manager.setReportContent(reportConent); System.out.println(" 建立報告:" + reportConent); EMPLOYEE_MAP.put(department,manager); } return manager; } }
四、建立測試類
public class Test { private final static String departments[] = {"RD","QA","PM"}; public static void main(String[] args) { for(int i = 0; i < 10 ; i++){ String department = departments[(int)(Math.random() * departments.length)]; Manager manager = (Manager) EmployeeFactory.getManager(department); manager.report(); } } }
5. UML圖
8、在源碼中的應用
一、Integer類valueOf方法(Long類的valueOf方法)
public static Integer valueOf(int var0) { assert Integer.IntegerCache.high >= 127; return var0 >= -128 && var0 <= Integer.IntegerCache.high?Integer.IntegerCache.cache[var0 + 128]:new Integer(var0); }