作用

系统有大量相似对象,需要缓冲池的场景
提供减少对象数量,降低内存中对象的数量,从而改善应用所需的对象结构的方式
应用于底层开发,以便解决系统性能问题
池化技术

Demo设计

部门做汇报,但并不需要每次进行汇报操作时都需要创建部门类

部门类

先定义一个部门接口,提供一个汇报方法

  1. public interface Employee {
  2. void report();
  3. }

创建一个类继承部门接口 部门管理类,用来进行汇报

  1. @Setter
  2. public class Manager implements Employee {
  3. private String department;
  4. private String reportContent;
  5. public Manager(String department) {
  6. this.department = department;
  7. }
  8. @Override
  9. public void report() {
  10. System.out.println(reportContent);
  11. }
  12. }

与工厂模式结合

获取部门对象,还要避免每次请求都new一次对象
使用hashmap来保存对象,通过判断来确保new对象次数降低

  1. public class EmployeeFactory {
  2. private static final Map<String, Employee> EMPLOYEE_MAP = new ConcurrentHashMap<>();
  3. public static Employee getManager(String department) {
  4. Manager manager = (Manager) EMPLOYEE_MAP.get(department);
  5. if (manager == null) {
  6. //new对象时会先打印这句话
  7. System.out.println("创建部门:" + department);
  8. manager = new Manager(department);
  9. manager.setReportContent(department + " : 部门汇报");
  10. EMPLOYEE_MAP.put(department, manager);
  11. }
  12. return manager;
  13. }
  14. }

测试方法

随机获取部门,然后做汇报

  1. public static void main(String[] args) {
  2. //部门名称数组
  3. String[] departments = {"DR", "BCMS", "AUTO", "OBMS"};
  4. for (int i = 0; i < 10; i++) {
  5. String department = departments[(int) (Math.random() * departments.length)];
  6. Employee manager = EmployeeFactory.getManager(department);
  7. manager.report();
  8. }
  9. }

一共调用10次但只new了四次对象
image.png

JDK中享元模式的运用

Integer中的运用

数值大于IntegerCache的最大值或小于最低值才new Integer对象

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