Java設計模式之享元模式
考慮這樣一個場景,年終公司要求部門領導去做報告,比如說多個領導要求研發部門經理在不同的時間分別去做報告,研發部門經理肯定是在第一次把報告準備好,以後直接拿來用,而不是每次都重新做一份報告。下面看看過程實現。
//新建員工接口
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 {
//用HashMap保存
private final static 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 content=department+"彙報,內容爲......";
manager.setReportContent(content);
System.out.print(" 第一次需要創建報告:");
//假如map緩存,下次直接用
EMPLOYEE_MAP.put(department,manager);
}
return manager;
}
}
//調用
private static final String departments[]={"研發部門","市場部門","財務部門","行政部門","質檢部門"};
public static void main(String [] a){
for (int i=0;i<10;i++){
String department=departments[(int)(Math.random() * departments.length)];
Manager manager= (Manager) EmployeeFactory.getManager(department);
manager.report();
}
}
//結果
第一次需要創建部門經理:市場部門 第一次需要創建報告:市場部門彙報,內容爲......
第一次需要創建部門經理:行政部門 第一次需要創建報告:行政部門彙報,內容爲......
行政部門彙報,內容爲......
第一次需要創建部門經理:研發部門 第一次需要創建報告:研發部門彙報,內容爲......
市場部門彙報,內容爲......
第一次需要創建部門經理:財務部門 第一次需要創建報告:財務部門彙報,內容爲......
財務部門彙報,內容爲......
市場部門彙報,內容爲......
行政部門彙報,內容爲......
行政部門彙報,內容爲......
從上面的結果可以看出,只有第一次需要創建部門經理和報告,後面直接從緩存去取。下面看看UML的類圖