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

  • 相关阅读:
    poj-2376 Cleaning Shifts (排序+贪心)
    AOJ 0525
    POJ -3050 Hopscotch
    POJ-2718 Smallest Difference
    AOJ 0121: Seven Puzzle (BFS DP STL 逆向推理)(转载)
    POJ-3187 Backward Digit Sums (暴力枚举)
    POJ-3669 Meteor Shower(bfs)
    分布式消息系统Kafka初步
    nginx源码学习----内存池
    def文件格式
  • 原文地址:https://www.cnblogs.com/weixk/p/12970178.html
Copyright © 2011-2022 走看看