享元模式
1. 分析
-
定義
提供了減少對象數量從而改善應用所需的對象結構的方式運用共享技術有效地支持大量細粒度的對象
-
類型:
結構型
-
適用場景
常常應用於系統底層的開發,以便解決系統的性能問題系統有大量相似的對象、需要緩衝池的場景
如(String、數據庫連接池、線程池) -
優點
減少對象的創建,降低內存中對象的數量,減少內存的佔用,從而提高性能減少內存之外的其它資源佔用
-
缺點
關注內/外部狀態、關注線程安全問題使系統、程序的邏輯複雜化
-
擴展
內部狀態:記錄在享元對象的內部,不會隨着環境的改變而改變的共享部分(類似 享元對象的一個屬性)
外部狀態:記錄在享元對象的外部,會隨着環境的改變而改變 -
模式比較
- 享元模式與代理模式
代理模式生成代理類,花費的時間比較多,可以使用享元模式提高程序的處理速度 - 享元模式與單例模式
享元模式:複用對象的思想
2. 示例
public interface Employee {
void report();
}
public class Manager implements Employee {
private String department;
private String reportContent;
public Manager(String department) {
this.department = department;
}
public void setReportContent(String reportContent) {
this.reportContent = reportContent;
}
@Override
public void report() {
System.out.println(reportContent);
}
}
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 reportContent = department + "\t部門彙報:此次報告的主要內容是:....";
manager.setReportContent(reportContent);
System.out.println(" 創建報告:" + reportContent);
EMPLOYEE_MAP.put(department, manager);
}
return manager;
}
}
public class Test {
private static final String[] departments = {"RD", "QA", "PM", "BD"};
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();
}
}
}
3. 源碼
java.lang.Integer
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
org.apache.commons.pool2.impl.GenericKeyedObjectPool