常用设计模式-享元模式

来源:互联网 发布:java技术课程表 编辑:程序博客网 时间:2024/05/29 15:04

享元模式:

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


单纯享元模式所涉及到的角色如下:

  ●  抽象享元(Flyweight)角色 :给出一个抽象接口,以规定出所有具体享元角色需要实现的方法。

  ●  具体享元(ConcreteFlyweight)角色:实现抽象享元角色所规定出的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。

  ●  享元工厂(FlyweightFactory)角色 :本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否已经有一个符合要求的享元对象。如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。

享元模式例子:

网站抽象类:
public interface Website { public void use(String name);}

网站具体类:
public class ConcreteWebsite implements Website{private String state="";public ConcreteWebsite(String state){this.state=state;}@Overridepublic void use(String name) {System.out.println("功能:"+this.state);System.out.println("用户:"+name);}}

网站工厂类:
public class WebsiteFactory {private Hashtable<String, Website> flyweights=new Hashtable<String, Website>();public Website getWebsiteCategory(String state){Website fly=flyweights.get(state);if(fly==null){fly=new ConcreteWebsite(state);flyweights.put(state, fly);}return fly;}public int getWebsiteCount(){return flyweights.size();}}

客户端代码:
public class Client {public static void main(String[] args) {WebsiteFactory f=new WebsiteFactory();Website f1=f.getWebsiteCategory("产品展示");f1.use("小明");Website f2=f.getWebsiteCategory("产品展示");f1.use("小李");Website f3=f.getWebsiteCategory("博客");f1.use("小网");System.out.println(f1==f2);System.out.println(f1==f3);System.out.println("功能的数目:"+f.getWebsiteCount());}}

程序的输出结果:


享元模式的应用:

当一个应用程序使用了大量的对象,而大量的对象造成了很大的存储开销时,就应该考虑使用享元模式。

享元模式是如此的重要,因为它能帮你在一个复杂的系统中大量的节省内存空间。在Java语言中,String类型就是使用了享元模式。String对象是final类型,对象一旦创建就不可改变。在JAVA中字符串常量都是存在常量池中的,JAVA会确保一个字符串常量在常量池中只有一个拷贝。String a="abc",其中"abc"就是一个字符串常量。

熟悉java的应该知道下面这个例子:


输出结果是:OK。可以看出if条件比较的是两a和b的地址,也可以说是内存空间。


部分内容引自:http://blog.csdn.net/jason0539/article/details/22908915

http://www.cnblogs.com/java-my-life/archive/2012/04/26/2468499.html

程杰《大话设计模式》