享元模式:顾名思义,该模式具有共享的特点,主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。 意图:运用共享技术有效地支持大量细粒度的对象。
主要用途:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。
应用实例: 1、JAVA 中的 String,如果有则返回,如果没有则创建一个字符串保存在字符串缓存池里面。 2、数据库的数据池。
下面通过一个建设网站的例子来体验一下享元模式的优点。
假设有人找你做小型网站,并答应会付给你一定报酬,如果你做的网站令客户比较满意他还会再找你做其他的网站。
网站类 WebSite.java
//网站类,在这里,一个WebSite的实例就代表一个客户要做的网站 public class WebSite { private String type ; //网站类型 public WebSite(String type){ this.type = type ; } public void use(){ System.out.println("该网站的类型为:"+type); } }客户来了,你跟我做一个博客类型的网站 你加班熬夜一顿撸 WebSite ws1 = new WebSite(“博客类型”); 然后客户又来了,不错,很满意,再帮忙做一个论坛吧,熟悉的需求。。。。 WebSite ws2 = new WebSite(“论坛类型”); 慢慢的你的名声也传开了,又过来几个客户找你同样是再要求做3个博客,2个论坛。
最终你还是给搞定了
WebSite ws1 = new WebSite("博客类型"); WebSite ws2 = new WebSite("论坛类型"); WebSite ws3 = new WebSite("博客类型"); WebSite ws4 = new WebSite("博客类型"); WebSite ws5 = new WebSite("博客类型"); WebSite ws6 = new WebSite("论坛类型"); WebSite ws7 = new WebSite("论坛类型");看上面的代码,一共7个实例,但是只有两种类型的网站,如果再来100个客户呢?还要使用100个实例吗,博客网站不都是相似的吗,只是一些细节不太一样而已。他们能否共享同一个实例呢?这就引入了今天的主角————享元模式
我们就是要让这些网站共享一部分代码。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KanHG6EF-1570794290498)(http://i.imgur.com/ArhKob2.png)]
定义一个享元工厂,用来创建共享的网站实例 WebSiteFactory.java
public class WebSiteFactory { //用来保存网站对象,如果存在相似的直接从map中取出,不存在则创建一个,并将其放入map中。 private static Map<String,WebSite> map = new HashMap<>(); public static WebSite getWebSite(String type){ WebSite webSite = map.get(type); if (webSite==null){ webSite = new WebSite(type); map.put(type,webSite); } return webSite ; } }客户端
public static void main(String[] args) { WebSite ws1 = WebSiteFactory.getWebSite("博客类型"); WebSite ws2 = WebSiteFactory.getWebSite("论坛类型"); WebSite ws3 = WebSiteFactory.getWebSite("博客类型"); WebSite ws4 = WebSiteFactory.getWebSite("博客类型"); WebSite ws5 = WebSiteFactory.getWebSite("博客类型"); WebSite ws6 = WebSiteFactory.getWebSite("论坛类型"); WebSite ws7 = WebSiteFactory.getWebSite("论坛类型"); ws1.use(); ws2.use(); ws3.use(); ws4.use(); ws5.use(); ws6.use(); ws7.use(); System.out.println(ws1==ws3); System.out.println(ws2==ws6); }运行结果
该网站的类型为:论坛类型 该网站的类型为:博客类型 该网站的类型为:博客类型 该网站的类型为:博客类型 该网站的类型为:论坛类型 该网站的类型为:论坛类型 true true从两个true我们可以发现博客1网站和博客3网站的对象是同一个,论坛2和论坛6的对象是同一个,同理,所有的博客网站对象都是同一个,所有的论坛网站对象也都是同一个。这样一来,就大大节省了内存空间,我们再给客户做网站时就可以节省出租用空间的费用了。
-----------------------这是结束线----------------------
– 2017-08-30 22:38