zoukankan      html  css  js  c++  java
  • (十一)享元模式-代码实现

    介绍

    概念:运用共享技术有效地支持大量细粒度的对象。

    应用场景:项目中某个类需要产生大量的对象,其中对象中的属性创建占用了大量的内存,如果这些属性对象可以被公用,那么可以利用享元模式把他们指向同一个地址.

    这让我想起了字符串常量池的做法.

    那么我们就用例子模仿一个字符串存储的逻辑.

    代码:

    //自创字符串类

    package note.com.flyweight;
    
    /**
     * 自定义String类
     * @author lxz
     *
     */
    public class MyString {
        private String name = null;
        
        public MyString(String name){
            this.name = name;
        }
        public String getName() {
            return name;
        }
        
    }

    //自创字符串常量池

    package note.com.flyweight;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * MyString存放池,类似字符串常量池
     * @author lxz
     *
     */
    public class MyStringPool {
    
        private static Map<String,MyString> map = new HashMap<String,MyString>();
        
        /*
         * 获取MyString
         */
        public static synchronized MyString getMyString(String key){
            MyString myString = map.get(key);
            if(myString==null){
                myString = new MyString(key);
                map.put(key, myString);
            }
            return myString;
        }
    }

    //人实体,其中名字属性用到我们自创的字符串来表示

    package note.com.flyweight;
    
    public class Person {
        private MyString name = null;
        private Integer age = null;
        public Person(MyString name,Integer age){
            this.name = name;
            this.age = age;
        }
        public MyString getName() {
            return name;
        }
        public void setName(MyString name) {
            this.name = name;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        
        
        
    }

    //测试类

    package note.com.flyweight;
    
    public class FlyWeightTest {
        
        public static void main(String[] args) {
            Person one = new Person(MyStringPool.getMyString("小明"),5);
            Person two = new Person(MyStringPool.getMyString("小红"),6);
            Person three = new Person(MyStringPool.getMyString("小明"),7);
            Person four = new Person(MyStringPool.getMyString("小明"),8);
            System.out.println(one.getName());
            System.out.println(two.getName());
            System.out.println(three.getName());
            System.out.println(four.getName());
        }
    }

    //结果:

    note.com.flyweight.MyString@659e0bfd
    note.com.flyweight.MyString@2a139a55
    note.com.flyweight.MyString@659e0bfd
    note.com.flyweight.MyString@659e0bfd

    结果可见,三个同名的Person实体,他们的name属性指向了同一个地址,这说明我们省了两个MyString的对象空间.假如有一万个同明的人,我们就省了九千九百九十九个对象的空间,情景尽可能极端,这样做的效果越好.

  • 相关阅读:
    详细解说仿制QQ列表 展开和收起列表
    带大家一步一步封装聊天键盘(三)新增功能不要错过哟
    带大家一步一步封装一个聊天键盘(二)
    带大家一步一步的封装一个聊天键盘(一)
    iOS中的屏幕适配之Autolayout(初级)
    iOS开发中tableViewCell的悬浮效果
    [Leetcode] 1343. Maximum Product of Splitted Binary Tree | 分裂二叉树的最大乘积
    [Leetcode] 560. Subarray Sum Equals K | 和为K的子数组
    爆炸!iOS资源大礼包(持续更新...)
    Objective-C探究alloc方法的实现
  • 原文地址:https://www.cnblogs.com/qinggege/p/5238639.html
Copyright © 2011-2022 走看看