设计模式之享元模式

来源:互联网 发布:adams数据导出 编辑:程序博客网 时间:2024/06/06 02:22

享元模式:顾名思义,该模式具有共享的特点,主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
意图:运用共享技术有效地支持大量细粒度的对象。

主要用途:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。

应用实例: 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个实例吗,博客网站不都是相似的吗,只是一些细节不太一样而已。他们能否共享同一个实例呢?这就引入了今天的主角————享元模式

我们就是要让这些网站共享一部分代码。

定义一个享元工厂,用来创建共享的网站实例
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);}

运行结果

该网站的类型为:论坛类型该网站的类型为:博客类型该网站的类型为:博客类型该网站的类型为:博客类型该网站的类型为:论坛类型该网站的类型为:论坛类型truetrue

从两个true我们可以发现博客1网站和博客3网站的对象是同一个,论坛2和论坛6的对象是同一个,同理,所有的博客网站对象都是同一个,所有的论坛网站对象也都是同一个。这样一来,就大大节省了内存空间,我们再给客户做网站时就可以节省出租用空间的费用了。

———————–这是结束线———————-

– 2017-08-30 22:38

原创粉丝点击