設計模式_17_享元模式


享元模式

1. 分析

  • 定義
    提供了減少對象數量從而改善應用所需的對象結構的方式

    運用共享技術有效地支持大量細粒度的對象

  • 類型: 結構型

  • 適用場景
    常常應用於系統底層的開發,以便解決系統的性能問題

    系統有大量相似的對象、需要緩衝池的場景
    如(String、數據庫連接池、線程池)

  • 優點
    減少對象的創建,降低內存中對象的數量,減少內存的佔用,從而提高性能

    減少內存之外的其它資源佔用

  • 缺點
    關注內/外部狀態、關注線程安全問題

    使系統、程序的邏輯複雜化

  • 擴展
    內部狀態:記錄在享元對象的內部,不會隨着環境的改變而改變的共享部分(類似 享元對象的一個屬性)
    外部狀態:記錄在享元對象的外部,會隨着環境的改變而改變

  • 模式比較

  1. 享元模式與代理模式
    代理模式生成代理類,花費的時間比較多,可以使用享元模式提高程序的處理速度
  2. 享元模式與單例模式
    享元模式:複用對象的思想

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章