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