享元模式

一、模式定义

运用共享技术有效的支持大量细粒度的对象;
共享对象:频繁使用,使用概率高的对象;
Java中的String就是一个享元模式的体现,实例如下:

 1 String name = "xxxx"; 

这里初始化了一个字符串类型的变量,这个变量的值被初始化后就直接被放入到了常量池中;

 1 String data = "xxx"; 

这时另外一个字符串对象被声明成同样的一个值,在JVM处理的过程中,首先看常量池中是否存在,如果存在,直接从常量池中去获取;

二、优点

如果系统中有大量的类似对象,可以节省大量的内存及CPU资源;

三、示例代码

  1 /**
  2  * 类描述:  享元模式Demo
  3  *
  4  * @author XXSD
  5  * @version 1.0.0
  6  * @date 2020/1/17 0017 下午 2:44
  7  */
  8 public class FlyweightTest {
  9     public static void main(String[] values) {
 10         final Areas areas1 = new Areas(1, ElementFactory.giveAreasMapByKey("test1", "a1", "b1"));
 11         final Areas areas2 = new Areas(1, ElementFactory.giveAreasMapByKey("test1", "a1", "b1"));
 12     }
 13 }
 14 
 15 /**
 16  * 类描述: 区域工厂
 17  *
 18  * @author : XXSD
 19  * @date : 2020/1/17 0017 下午 3:16
 20  */
 21 class ElementFactory {
 22     private static Map<String, Element> areasMap = new ConcurrentHashMap<>(16);
 23 
 24     /**
 25      * 功能描述:获取对应的元素描述对象
 26      *
 27      * @author : XXSD
 28      * @date : 2020/1/17 0017 下午 3:20
 29      */
 30     public static Element giveAreasMapByKey(String key, String name, String value) {
 31         if (areasMap.containsKey(key)) {
 32             return areasMap.get(key);
 33         }
 34         final Element element = new Element();
 35 
 36         element.setName(name);
 37         element.setValue(value);
 38         areasMap.put(key, element);
 39         return element;
 40     }
 41 }
 42 
 43 /**
 44  * 类描述: 区域描述
 45  *
 46  * @author : XXSD
 47  * @date : 2020/1/17 0017 下午 3:12
 48  */
 49 class Areas {
 50 
 51     /**
 52      * 属性描述:范围
 53      *
 54      * @date : 2020/1/17 0017 下午 3:13
 55      */
 56     private final int range;
 57     /**
 58      * 属性描述:元素描述对象
 59      *
 60      * @date : 2020/1/17 0017 下午 3:14
 61      */
 62     public final Element element;
 63 
 64     /**
 65      * 功能描述:区域描述
 66      *
 67      * @author : XXSD
 68      * @date : 2020/1/17 0017 下午 3:14
 69      */
 70     public Areas(int range, Element element) {
 71         this.range = range;
 72         this.element = element;
 73     }
 74 
 75     /**
 76      * 功能描述:范围
 77      *
 78      * @author : XXSD
 79      * @date : 2020/1/17 0017 下午 3:15
 80      */
 81     public int getRange() {
 82         return range;
 83     }
 84 
 85     /**
 86      * 功能描述:元素描述对象
 87      *
 88      * @author : XXSD
 89      * @date : 2020/1/17 0017 下午 3:16
 90      */
 91     public Element getElement() {
 92         return element;
 93     }
 94 }
 95 
 96 /**
 97  * 类描述: 元素描述不可变对象
 98  *
 99  * @author : XXSD
100  * @date : 2020/1/17 0017 下午 2:53
101  */
102 @ToString
103 class Element {
104     /**
105      * 属性描述:属性
106      *
107      * @date : 2020/1/17 0017 下午 2:54
108      */
109     private String name;
110     /**
111      * 属性描述:属性
112      *
113      * @date : 2020/1/17 0017 下午 2:54
114      */
115     private String value;
116 
117     public String getName() {
118         return name;
119     }
120 
121     public void setName(String name) {
122         this.name = name;
123     }
124 
125     public String getValue() {
126         return value;
127     }
128 
129     public void setValue(String value) {
130         this.value = value;
131     }
132 }

 

posted @ 2020-01-30 13:21  xxsd  阅读(134)  评论(0)    收藏  举报