(1)使用背景
假如现在有一个文本文件,里面只有大小写字母,如果对所有字母都创建一个实例,当文章较长的时候,内存肯定不够用
因为实际上大小写字母只有52个,那么我么只用生成52个对象,然后复用这些对象即可
(2)实现
字母类实现
public class Letter {
private char letter;
public Letter(char letter) {
this.letter = letter;
}
public char getLetter() {
return letter;
}
public void setLetter(char letter) {
this.letter = letter;
}
}
工厂类实现
public class LetterFactory {
private static Map<Character,Letter> alphabet = new HashMap<Character,Letter>(52);
public static Letter createLetter(char letter){
Letter res = alphabet.get(letter);
if (res==null) {
res = new Letter(letter);
alphabet.put(letter, res);
}
return res;
}
}
测试类
public class FlyWeightTest {
@Test
public void test() {
Letter letter1 = LetterFactory.createLetter('a');
Letter letter2 = LetterFactory.createLetter('b');
Letter letter3 = LetterFactory.createLetter('A');
Letter letter4 = LetterFactory.createLetter('a');
Letter letter5 = LetterFactory.createLetter('a');
System.out.println(letter1);
System.out.println(letter2);
System.out.println(letter3);
System.out.println(letter4);
System.out.println(letter5);
}
}
结果为:
com.test.Letter@63ef032c
com.test.Letter@60b970f5
com.test.Letter@2ea7166f
com.test.Letter@63ef032c
com.test.Letter@63ef032c
可以看出:其中的a使用的是同一个对象
(3)总结
1.java中的字符串常量池使用的就是享元模式
内容相同的字符串在常量池中只会保存一份,也就是下面的代码:
String a = "hello";
String b = "hello";
if(a == b)
System.out.println("OK");
else
System.out.println("Error");
结果是OK
2.核心
也就是在工厂中使用一个容器存储已经生成的实例,如果外部需要需要生成实例,先查找是否存在,若存在则返回;不存在则先生成再存储起来
线程池、数据库连接池都是使用享元模式