設計模式-享元模式

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);
    }
相關文章
相關標籤/搜索