享元模式

(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.核心

                   也就是在工厂中使用一个容器存储已经生成的实例,如果外部需要需要生成实例,先查找是否存在,若存在则返回;不存在则先生成再存储起来


                 3.使用场景
                    线程池、数据库连接池都是使用享元模式


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值