天天看点

设计模式_17_享元模式

文章目录

    • 享元模式
      • 1. 分析
      • 2. 示例
      • 3. 源码

享元模式

1. 分析

  • 定义

    提供了减少对象数量从而改善应用所需的对象结构的方式

    运用共享技术有效地支持大量细粒度的对象

  • 类型:

    结构型

  • 适用场景

    常常应用于系统底层的开发,以便解决系统的性能问题

    系统有大量相似的对象、需要缓冲池的场景

    如(String、数据库连接池、线程池)

  • 优点

    减少对象的创建,降低内存中对象的数量,减少内存的占用,从而提高性能

    减少内存之外的其它资源占用

  • 缺点

    关注内/外部状态、关注线程安全问题

    使系统、程序的逻辑复杂化

  • 扩展

    内部状态:记录在享元对象的内部,不会随着环境的改变而改变的共享部分(类似 享元对象的一个属性)

    外部状态:记录在享元对象的外部,会随着环境的改变而改变

  • 模式比较
  1. 享元模式与代理模式

    代理模式生成代理类,花费的时间比较多,可以使用享元模式提高程序的处理速度

  2. 享元模式与单例模式

    享元模式:复用对象的思想

2. 示例

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 {
    private static final 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 reportContent = department + "\t部门汇报:此次报告的主要内容是:....";

            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();
        }
    }
}
           
设计模式_17_享元模式

3. 源码

java.lang.Integer

public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
           

org.apache.commons.pool2.impl.GenericKeyedObjectPool

上一篇: survival shooter

继续阅读