Java设计模式之享元模式实例详解

  

本文实例讲述了Java设计模式之享元模式。分享给大家供大家参考,具体如下:

  

<>强解释一下概念:强也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。比如说一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象。如果有一个1米的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了。那么如果要是每个字母都共享一个对象,那么就大大节约了资源。

  

在轻量级模式中,由于要产生各种各样的对象,所以在轻量级(享元)模式中常出现工厂模式.Flyweight的内部状态是用来共享的,轻量级选手工厂负责维护一个对象存储池(轻量级选手池)来存放内部状态的对象.Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度。应用场合很多,下面举个例子:

  

先定义一个抽象的轻量级类:

        包轻量级选手;   公共抽象类轻量级{   公共抽象空操作();   }      之前      

实现一个具体类:

        包轻量级选手;   公开课ConcreteFlyweight延伸轻量级{   私人字符串的字符串;   公共ConcreteFlyweight (String str) {   字符串=str;   }   公共空间操作()   {   system . out。println(“混凝土——轻量级选手:“+字符串);   }   }      之前      

实现一个工厂方法类:

        包轻量级选手;   进口java.util.Hashtable;   公开课FlyweightFactory {   私人Hashtable flyweight=new散列表();//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1   公共FlyweightFactory () {}   公共轻量级getFlyWeight(对象obj) {   轻量级选手轻量级=(轻量级)flyweights.get (obj);//- - - - - - - - - - - - - - - - - 2   如果(轻量级选手==null){//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 3所示//产生新的ConcreteFlyweight   轻量级选手=new ConcreteFlyweight ((String) obj);   轻量级选手。把(obj,轻量级);//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5所示   }   返回flyweight;//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 6所示   }   公共int getFlyweightSize () {   返回flyweights.size ();   }   }      之前      

这个工厂方法类非常关键,这里详细解释一下:

  

在1处定义了一个Hashtable用来存储各个对象;在2处选出要实例化的对象,在6处将该对象返回,如果在哈希表中没有要选择的对象,此时变量轻量级为null,产生一个新的轻量级选手存储在哈希表中,并将该对象返回。

  

最后看看轻量级的调用:

        包轻量级选手;   进口java.util.Hashtable;   公开课FlyweightPattern {   FlyweightFactory工厂=new FlyweightFactory ();   轻量级选手fly1;   轻量级选手fly2;   轻量级选手fly3;   轻量级选手fly4;   轻量级选手fly5;   轻量级选手fly6;/* * *//* * FlyweightPattern */的创建一个新的实例   公共FlyweightPattern () {   fly1=factory.getFlyWeight(“谷歌”);   fly2=factory.getFlyWeight (“Qutr”);   fly3=factory.getFlyWeight(“谷歌”);   fly4=factory.getFlyWeight(“谷歌”);   fly5=factory.getFlyWeight(“谷歌”);   fly6=factory.getFlyWeight(“谷歌”);   }   公共空间showFlyweight () {   fly1.operation ();   fly2.operation ();   fly3.operation ();   fly4.operation ();   fly5.operation ();   fly6.operation ();   int objSize=factory.getFlyweightSize ();   system . out。println (“objSize=" + objSize);   }   公共静态void main (String [] args) {   system . out。println(“享元模式!”);   FlyweightPattern fp=new FlyweightPattern ();   fp.showFlyweight ();   }   }      之前      

下面是运行结果:

  
  

混凝土——轻量级选手:谷歌
  混凝土——轻量级选手:Qutr
  混凝土——轻量级选手:谷歌
  混凝土——轻量级选手:谷歌
  混凝土——轻量级选手:谷歌
  混凝土——轻量级选手:谷歌
  objSize=2

     

我们定义了6个对象,其中有5个是相同的,按照轻量级模式的定义“谷歌”应该共享一个对象,在实际的对象数中我们可以看出实际的对象却是只有2个。

Java设计模式之享元模式实例详解