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

    享元模式 通过对象的复用来减少对象创建的次数和数量,以减少系统内存的使用和降低系统的负载。在系统需要一个对象时,享元模式首先在系统中查找并尝试重用现有的对象,如果未找到匹配的对象,则创建新对象并将其缓存在系统中以便下次使用。

    image

    (1)定义Memory

    public class Memory{
        private int size;
        private boolean isused;
        private String id;
        public Memory(int size,boolean isused,String id){
            this.size = size;
            this.isused = isused;
            this.id = id;
        }
        
        public int getSize() {
            return size;
        }
        
        public void setSize(int size) {
            this.size = size;
        }
        
        public boolean isIsused() {
            return isused;
        }
    
        public void setIsused(boolean isused) {
            this.isused = isused;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    }

    (2)定义MemoryFactory工厂

    public class MemoryFactory{
        private final static Log logger = LogFactory.getLog(this.getClass());
    
        private static List<Memory> memoryList = new ArrayList<>();
        public static Memory getMemory(int size){
            Memory memory = null;
            for (int i = 0; i<memoryList.size();i++){
                memory = memoryList.get(i);
                // 如果存在和需求size一样大小并且未使用的内存块,则直接使用
                if (memory.getSize() == size && memory.isIsused() == false){
                    memory.setIsused(true);
                    memoryList.set(i,memory);
                    logger.info("get memory from memoryList");
                    break;
                }
            }
            if (memory == null){
                memory = new Memory(32,false, UUID.randomUUID().toString());
                memoryList.add(memory);
            }
    
            return memory;
        }
    
        // 释放内存
        public static void releaseMemory(String id){
            for (int i = 0; i < memoryList.size(); i++) {
                Memory memory = memoryList.get(i);
                if (memory.getId().equals(id)){
                    memory.setIsused(false);
                    memoryList.set(i,memory);
                    logger.info("release memory"+id);
                    break;
                }
            }
        }
    }

    (3)使用享元模式

    public static void main(String[] args){
        // 获取内存
        Memory memory = MemoryFactory.getMemory(32);
        // 释放内存
        MemoryFactory.releaseMemory(memory.getId());
        // 重新获取内存
        MemoryFactory.getMemory(32);
    }

  • 相关阅读:
    添加AdMob的Native广告
    androidx.recyclerview.widget.RecyclerView的使用方法
    androidx.recyclerview.widget.RecyclerView 使用记录
    ViewPager使用
    小程序加载云端数据库中的第二页数据,前端如何动态显示?
    小程序页面跳转传递参数
    小程序云端函数 where遇到的问题
    Python 加载包含多个JSON对象的JSON文件
    如何把一个目录下的中文名字的文件全部变成拼音命名的文件?
    小技巧--解决eclipse导入的jar文件后,无法使用默认包中的方法问题
  • 原文地址:https://www.cnblogs.com/betterwgo/p/15239580.html
Copyright © 2011-2022 走看看