Java设计模式之享元模式

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

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