zoukankan      html  css  js  c++  java
  • 享元模式

    一、享元模式介绍

    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<String,Employee> EMPLOYEE_MAP = new HashMap<String,Employee>();
    
        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();
    
            }
        }
    }
    

    类图:

    三、源码示例

    JDK中的Integer

  • 相关阅读:
    批量管理增量日志(seek、tell)
    字符串和编码
    5.activiti--完成任务
    4.activiti--代理任务Claiming the task
    3.activiti--待办任务
    2.activiti-启动流程实例
    1.activiti-流程图
    html 各种高度
    redis-过期时间、访问限制与缓存
    spring mvc controller 接收参数
  • 原文地址:https://www.cnblogs.com/weixk/p/12970178.html
Copyright © 2011-2022 走看看