享元模式
一、模式定义
运用共享技术有效的支持大量细粒度的对象;
共享对象:频繁使用,使用概率高的对象;
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 }

浙公网安备 33010602011771号