JAVA 23种设计模式之结构型模式—享元模式(12)

java设计模式之享元模式:享元模式采用一个共享来避免大量拥有相同内容对象的开销。这种开销最常见、最直观的就是内存的损耗


用我们的白话说,享元模式就是,共享一个对象。

再通俗一点,你去商店买东西,你买了一把牙刷,然后过几天牙刷坏了,你又来买牙刷。你就自己去那里(货架)取就是了。因为货架上的牙刷是共有的,你可以买,别人也可以买。老板不会因为你买了而另外又弄一个货架放牙刷。

当然,如果牙刷没有了,就就会说,老板,没牙刷了,老板就会去取一些牙刷来放在货架上。


再举一个例子(用java思想来说话)

巧克力:假设我们这里的巧克力有3种:夹心,牛奶,威化。这时如果有顾客要买夹心的巧克力2个,牛奶的3个,威化的1个,一共6个,那是不是要创建6个对象呢。当然不是,根据需要我们仅仅只需要创建3个对象就可以了撒。

以下为代码实例:

1,创建一个接口,该接口提供一个方法:


public interface Chocolates {
	//卖出巧克力,夹心,牛奶,威化
	public void sellout();
}
2,实现该接口,这里可以理解为,卖出了一个什么样的巧克力



public class CFlyweight implements Chocolates{
	private String chocolatesName;

	public CFlyweight(String chocolatesName){
		this.chocolatesName = chocolatesName;
	}
	@Override
	public void sellout() {
		System.out.println("卖出巧克力,口味是:"+chocolatesName);
		
	}

}
3,核心部分,享元(共享)工厂。



public class FlyweightFactory {
	//储存对象
	private Hashtable flyweight = new Hashtable();
	
	//参数obj,这里表示巧克力的口味,比如夹心(jiaxin)
	public Chocolates getChocolates(Object obj){
		//获得一个巧克力对象
		Chocolates chocolates = (CFlyweight) flyweight.get(obj);
		if(chocolates == null){
			chocolates = new CFlyweight((String)obj);
			flyweight.put(obj, chocolates);
		}
		return chocolates;
	}
	
	//这里测试我们保存了多少个对象(模拟内存中有多少个对象)
	public int getFlyweightSize(){
		return flyweight.size();
	}
}
4,测试demo



public class demo {
	//我们这里假设有客人需要夹心的巧克力2个,牛奶的3个,威化的1个,一共6个
	//我们就需要去货架上取六次(货架)
	
	//1,实例化工厂货架
	FlyweightFactory factory = new FlyweightFactory();
	
	//2,定义六种巧克力
	Chocolates c1,c2,c3,c4,c5,c6;
	
	//3,获得六种巧克力,并展示出来
	public void showChocolates(){
		c1 = factory.getChocolates("夹心");
		c2 = factory.getChocolates("夹心");
		c3 = factory.getChocolates("牛奶");
		c4 = factory.getChocolates("牛奶");
		c5 = factory.getChocolates("牛奶");
		c6 = factory.getChocolates("威化");
		c1.sellout();
		c2.sellout();
		c3.sellout();
		c4.sellout();
		c5.sellout();
		c6.sellout();
		
		System.out.println("一共创建了多少个对象:"+factory.getFlyweightSize()+"个");
	}
	
	public static void main(String[] args) {
		demo d = new demo();
		d.showChocolates();

	}

}


最后显示出来的接口如下:

卖出巧克力,口味是:夹心
卖出巧克力,口味是:夹心
卖出巧克力,口味是:牛奶
卖出巧克力,口味是:牛奶
卖出巧克力,口味是:牛奶
卖出巧克力,口味是:威化
一共创建了多少个对象:3个
跟我们预期的结果是一致的,显示出卖掉了6个巧克力,而在程序执行期间,一共只创建了三个对象。而不是六个。




爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情Blog Img