享元模式

一、享元模式介绍

1、定义与类型

定义:提供了减少对象数量从而改善应用所需的对象结构的方式
运用共享技术有效地支持大量细粒度的对象
也可理解为缓存操作
类型:结构型

2、适用场景

常常应用于系统底层的开发,以便解决系统的性能问题。
系统有大量相似对象、需要缓冲池的场景。

3、优点

减少对象的创建,降低内存中对象的数量,降低系统的内存,提高效率
减少内存之外的其他资源占用

4、缺点

关注内/外部状态、关注线程安全问题
使系统、程序的逻辑复杂化

5、扩展

内部状态
外部状态

6、相关设计模式

享元模式和代理模式
享元模式和单例模式

二、代码示例

员工接口类:

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 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 reportContent = department+"部门汇报:此次报告的主要内容是......";
            manager.setReportContent(reportContent);
            System.out.println(" 创建报告:"+reportContent);
            EMPLOYEE_MAP.put(department,manager);

        }
        return manager;
    }

}

测试类:

public class Test {
    private static final String departments[] = {"RD","QA","PM","BD"};
    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();

        }
    }
}

类图:
享元模式_第1张图片

三、源码示例

JDK中的Integer

享元模式_第2张图片

你可能感兴趣的:(享元模式)