本文是自己的学习笔记,主要参考以下资料
- 大话设计模式,程杰著,清华大学出版社出版
- 马士兵教育
享元模式是为了重复利用对象。
当我们键盘输入的时候,比如按下A,如果每按下一个A就会有一个对象产生,那这样的小对象就实在是太多了。为了不造成内存浪费,我们用一个池子将这些小对象装起来,当需要使用的时候就去池子里拿,而不是每次都创建一个新对象。
享元这样的池化思想应用很普遍,比如线程池,数据库连接池等。
所谓的fly weight就是说苍蝇的重量,泛指很小的单位。
Java的字符串池就是很经典的享元模式的案例。
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
String s4 = new String("abc");
System.out.println(s1 == s2); //true
System.out.println(s1 == s3); //false
System.out.println(s3 == s4); //false
System.out.println(s3.intern() == s1); //true
System.out.println(s3.intern() == s4.intern()); //true
先看这张UML类图
这个与组合模式的UML图很相似,其中的"ABABBA"
这样的字符串就可以看成是Branch
。它有子节点,他就是由'A','B'
这样的子节点组成的,这样更节省空间。