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/天,具体规则查看活动详情