美文网首页js css html
设计模式之享元模式

设计模式之享元模式

作者: Tinyspot | 来源:发表于2023-02-08 22:41 被阅读0次

    1. 享元模式(Flyweight Pattern)

    • 定义:Use sharing to support large numbers of fine-grained objects efficiently.(使用共享对象可有效地支持大量的细粒度的对象
    • 享元,即被共享的单元
    • 作用:对象复用(减少对象的创建),节省内存

    1.2 享元模式在 Interger 的应用

    Integer(包装器类型) 使用享元模式来复用对象
    如果要创建的 Integer 对象的值在 -128 到 127 之间(一个字节的大小),会从 IntegerCache 类中直接返回,否则才调用 new 方法创建

    2. 示例:实现对象池

    享元模式(Flyweight Pattern)是池技术的重要实现方式

    虽然可以使用享元模式可以实现对象池,但是这两者还是有比较大的差异,对象池着重在对象的复用上,池中的每个对象是可替换的,从同一个池中获得A对象和B对象对客户端来说是完全相同的,它主要解决复用,而享元模式在主要解决的对象的共享问题,如何建立多个可共享的细粒度对象则是其关注的重点

    public class SignInfoFactory {
    
        private static HashMap<String, SignInfo> pool = new HashMap<>();
    
        @Deprecated
        public static SignInfo getSignInfo() {
            return new SignInfo();
        }
    
        /**
         * 从池中获取对象
         */
        public static SignInfo getSignInfo(String key) {
            SignInfo result;
    
            if (!pool.containsKey(key)) {
                result = new SignInfo4Pool(key);
                pool.put(key, result);
                System.out.println(key + "---建立对象,并放入池中");
            } else {
                result = pool.get(key);
                System.out.println(key + "---直接从池中取得");
            }
            return result;
        }
    }
    
    @Data
    @AllArgsConstructor
    public class SignInfo4Pool extends SignInfo {
        /**
         * 把相同属性提取出来组成一个唯一key
         */
        private String key;
    }
    
    @Data
    public class SignInfo {
        private String id;
        private String location;
        private String subject;
        private String postAddress;
    }
    

    测试

    public class SignInfoTest {
    
        @Test
        public void test1() {
            for (int i = 0; i < 10; i++) {
                SignInfo singInfo = SignInfoFactory.getSignInfo();
                System.out.println(singInfo);
            }
        }
    
        @Test
        public void test2() {
            for (int i = 1; i < 6; i++) {
                for (int j = 1; j < 3; j++) {
                    String key = "科目" + i + "考试地点" + j;
                    SignInfoFactory.getSignInfo(key);
                }
            }
            SignInfo signInfo = SignInfoFactory.getSignInfo("科目2考试地点2");
            System.out.println(signInfo);
        }
    }
    

    相关文章

      网友评论

        本文标题:设计模式之享元模式

        本文链接:https://www.haomeiwen.com/subject/dthckdtx.html