六、享元模式

weixin_34402408發表於2018-10-06

享元模式的主要目的是實現物件的共享,即共享池,當系統中物件多的時候可以減少記憶體的開銷,通常與工廠模式一起使用。

FlyWeightFactory負責建立和管理享元單元,當一個客戶端請求時,工廠需要檢查當前物件池中是否有符合條件的物件,如果有,就返回已經存在的物件,如果沒有,則建立一個新物件,FlyWeight是超類。一提到共享池,我們很容易聯想到Java裡面的JDBC連線池,想想每個連線的特點,我們不難總結出:適用於作共享的一些個物件,他們有一些共有的屬性,就拿資料庫連線池來說,url、driverClassName、username、password及dbname,這些屬性對於每個連線來說都是一樣的,所以就適合用享元模式來處理,建一個工廠類,將上述類似屬性作為內部資料,其它的作為外部資料,在方法呼叫時,當做引數傳進來,這樣就節省了空間,減少了例項的數量。

public interface Employee {
    void report();
}
public class Manager implements Employee {
    @Override
    public void report() {
        System.out.println(reportContent);
    }
    private String title = "部門經理";
    private String department;
    private String reportContent;

    public void setReportContent(String reportContent) {
        this.reportContent = reportContent;
    }

    public Manager(String department) {
        this.department = department;
    }


}
public class EmployeeFactory {
    private static final Map<String,Employee> EMPLOYEE_MAP = new HashMap<String,Employee>();

    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+"部門彙報:此次報告的主要內容是......";
            manager.setReportContent(reportContent);
            System.out.println(" 建立報告:"+reportContent);
            EMPLOYEE_MAP.put(department,manager);

        }
        return manager;
    }

}

相關文章