`

享元模式

阅读更多
通常情况下,我们会需要使用某个对象的时候会直接new,然后使用完后就等着垃圾回收器回收,但是如果访问量比较大new的对象比较多,那么很有可能会造成内存数据过大甚至是溢出的情况。享元模式最主要的目的就是解决减少大量创建新的对象,让多个对象引用公用缓存中的同一个对象。有点类始于连接池,当你需要的时候返回一个你所需的对象一样。
享元模式一共包含2个重要概念,一个是内蕴状态和外蕴状态。两种状态的充当者你可以根据自己的需要进行实现。
内蕴状态表示多个对象共享的部分。
外蕴状态表示每个对象独有的状态部分。
如现实中的聊天软件,你同时跟很多用户聊天,但不是你每次和某个用户的发送数据时都创建一个对象。而是多次公用一个对象,这就是使用了享元模式。
享元模式的组成元素:
享元接口:用于定义让具体享元实现的规范(定义方法)。
具体享元:实现享元接口。然后根据需要定义内蕴状态,可以是对象集合等等。就是共享的数据。然后定义一个外蕴状态。
定一个一个工厂方法,用户容纳各个具体享元元素,根据调用出需要返回合适的享元对象。
实例
抽象享元
public interface FlyWeight{
    //提供给具体享元元素一个操作的方法,该方法是接收外蕴状态的
     void operator();
    //这里定义一个显示内蕴和外蕴状态的方法
     void display();
}
定义具体享元元素A:
public class FlyWeightA implements FlyWeight{
    //定义内蕴状态这里定一个从数据库查询出的集合
     private List list;
    //定义一个外蕴状态,用于接收外部的状态然后执行外部的特殊需求
     private String outDesc;//可以根据自己的需求定义
   
     public FlyWeightA(){

    }
   
    void operate(String outDesc){
     this.outDesc = outDesc;
     //通过内蕴和外蕴实现所需要的逻辑
     sysout(outDesc);
  }

    void show(){
    //输出内蕴和外蕴状态
}

}

定义具体享元元素B:
public class FlyWeightB implements FlyWeight{
    //定义内蕴状态这里定一个从数据库查询出的集合
     private List list;
    //定义一个外蕴状态,用于接收外部的状态然后执行外部的特殊需求
     private String outDesc;//可以根据自己的需求定义
   
     public FlyWeightB(){

    }
   
    void operate(String outDesc){
     this.outDesc = outDesc;
     //通过内蕴和外蕴实现所需要的逻辑
     sysout(outDesc);
  }

    void show(){
    //输出内蕴和外蕴状态
}
}

定义工厂元素
public class FlyWeightFactory{
    private HashTable hash = new HashTable ();

    public FlyWeightFactory(){
        //分别生成A和B对象然后放入hash中
    }
   
    public FlyWeight get(String key){
     //根据不同的key返回所需要的FlyWeight
   }

}

//然后进行调用
main(){
   FlyWeightFactory factory = new FlyWeightFactory();
   //生产A
   FlyWeight aFlyWeight = factory.get("A");
   aFlyWeight.operator("a access");
  //生产b
  FlyWeight aFlyWeight = factory.get("b");
   aFlyWeight.operator("b access");
 
  //生产A
  FlyWeight aFlyWeight = factory.get("A");
   aFlyWeight.operator("A access");
   //实际上返回的还是第一个对象,只是可以外蕴不同罢了
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics