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的类图