单例模式在缓存机制中的应用

来源:互联网 发布:淘宝秒杀群怎么做 编辑:程序博客网 时间:2024/05/16 10:49

单例模式:顾名思义,一个系统中中定义的某类只有一个实例。
    缓存应用:将要用到的资源提前从数据库或其他地方下载到内存,提高系统反应速度,增强用户体验满意度。
    本例子来自于一个真实的项目,作者巧妙地将单例模式应用于缓存机制中。阅读本文,对单例模式,缓存机制都可以有进一步的认识和把握。

    背景:
    Javame 中绘制本地图片太频繁,同一图片不同地方绘制,每次都要装载图片,每次都要新建对象。

    解决方案:
    缓存应用:加载程序时,将所有有可能要绘的本地图片全部预装载到缓存,需要绘制的时候直接从缓存中读取.由于缓存器被设置为登记式缓存,即使以后有新图片加入本地资源,也无须更改原有代码,直接在新增功能程序里调用缓存即可。

    具体实现:采用单例的设计模式来实现缓存应用。原因:缓存控制器整个系统中只需要一个即可。

    源代码:
    ImageBean.Java(封装下载的图片的 javaBean)

Java代码
  1. package com.xxx.bean;    
  2. /**   
  3.  * 文件名:ImageBean.java   
  4.  *   
  5.  * 版本信息:   
  6.  * 日期:2009-10-21   
  7.  * Copyright xxx Corporation 2009    
  8.  * 版权所有   
  9.  *   
  10.  */    
  11. /**   
  12.  *    
  13.  * 项目名称:Test   
  14.  * 类名称:ImageBean   
  15.  * 类描述:封装下载的图片的 Javabean.   
  16.  * 创建人:Defonds   
  17.  * 创建时间:2009-10-21 上午11:30:45   
  18.  * 修改人:Defonds   
  19.  * 修改时间:2009-10-21 上午11:30:45   
  20.  * 修改备注:   
  21.  * @version    
  22.  *    
  23.  */    
  24. public class ImageBean    
  25. {    
  26.     //------------------------------------------------------    
  27.     //fields.    
  28.         
  29.     /**   
  30.      *  地图图片的横坐标.   
  31.      */    
  32.     private int abscissa;    
  33.         
  34.     /**   
  35.      *  地图图片的纵坐标.   
  36.      */    
  37.     private int ordinate;    
  38.         
  39.     /**   
  40.      *  要下载地图的 http url 链接地址.   
  41.      */    
  42.     private String url;    
  43.         
  44.     /**   
  45.      *  下载的图片的字节流.   
  46.      */    
  47.     private byte[] byteOfImage;    
  48.     //--------------------------------------------------------------------    
  49.     //The getters and setters.    
  50.         
  51.     public int getAbscissa()    
  52.     {    
  53.         return abscissa;    
  54.     }    
  55.     public void setAbscissa(int abscissa)    
  56.     {    
  57.         this.abscissa = abscissa;    
  58.     }    
  59.     public int getOrdinate()    
  60.     {    
  61.         return ordinate;    
  62.     }    
  63.     public void setOrdinate(int ordinate)    
  64.     {    
  65.         this.ordinate = ordinate;    
  66.     }    
  67.     public String getUrl()    
  68.     {    
  69.         return url;    
  70.     }    
  71.     public void setUrl(String url)    
  72.     {    
  73.         this.url = url;    
  74.     }    
  75.     public byte[] getByteOfImage()    
  76.     {    
  77.         return byteOfImage;    
  78.     }    
  79.     public void setByteOfImage(byte[] byteOfImage)    
  80.     {    
  81.         this.byteOfImage = byteOfImage;    
  82.     }    
  83.         
  84. }    

ImageManager.java(单例类负责所有本地图片的管理工作 [缓存器的管理类])

Java代码
  1. /**   
  2.  * 文件名:ImageManager.java   
  3.  *   
  4.  * 版本信息:   
  5.  * 日期:2009-10-28   
  6.  * Copyright xxx Corporation 2009    
  7.  * 版权所有   
  8.  *   
  9.  */    
  10. package com.xxx.util;    
  11. import java.io.IOException;    
  12. import java.util.Hashtable;    
  13. import javax.microedition.lcdui.Image;    
  14. /**   
  15.  *    
  16.  * 项目名称:Basic1.0   
  17.  * 类名称:ImageManager   
  18.  * 类描述:单例类负责所有本地图片的管理工作 [缓存器的管理类]   
  19.  * 创建人:Defonds   
  20.  * 创建时间:2009-10-28 上午11:32:43   
  21.  * 修改人:Defonds   
  22.  * 修改时间:2009-10-28 上午11:32:43   
  23.  * 修改备注:   
  24.  * @version    
  25.  *    
  26.  */    
  27. public class ImageManager    
  28. {    
  29.     /**   
  30.      * 缓存器.专门用来存放程序中用到的图片.   
  31.      */         private static Hashtable imageCache = null;    
  32.         
  33.     /**   
  34.      * 饿汉式单例模式,类加载器加载时就有了本类的一个实例,提高了系统效率.   
  35.      */    
  36.     private static ImageManager instance = new ImageManager();    
  37.     /**   
  38.      * 私有的构造子,防止被任意调用,保证本类在整个项目中只能有一个实例.   
  39.      */    
  40.     private ImageManager()    
  41.     {    
  42.         imageCache = new Hashtable();    
  43.     }    
  44.     /**   
  45.      * 这里提供了一个供外部调用本 class 的静态方法,可以直接访问   
  46.      */    
  47.     public static ImageManager getInstance()    
  48.     {    
  49.         return instance;    
  50.     }    
  51.     /**   
  52.      * 登记式缓存器的应用.   
  53.      * 如果图片是第一次访问本方法,产生一个实例并返回.同时将此实例加载到缓存器之中   
  54.      * 如果图片是第2,3,,,n次访问本方法,直接返回该图片实例,大大提高了系统运行效率   
  55.      */    
  56.     public Image getImage(String name)    
  57.     {    
  58.         Image image = null;    
  59.         try    
  60.         {    
  61.             System.out.println("111111111111111");    
  62.             if (null == imageCache.get(name))    
  63.             {    
  64.                 System.out.println("222222222222222");    
  65.                 image = Image.createImage("/" + name + ".png");    
  66.                 System.out.println("33333333333333333333");    
  67.                 imageCache.put(name, image);    
  68.             }else    
  69.             {    
  70.                 image = (Image)imageCache.get(name);    
  71.             }    
  72.         }catch (IOException ioe)    
  73.         {    
  74.             ioe.printStackTrace();    
  75.         }    
  76.             
  77.         return image;    
  78.     }    
  79.         
  80.     /**   
  81.      * 批量将一个数组中所有的图片放入缓存器[一般是在 MIDlet 中对缓存器初始化时使用   
  82.      */    
  83.     public  void loadImagesCache(String[] names)    
  84.     {    
  85.         for (int i = 0; i < names.length; i++)    
  86.         {    
  87.             try    
  88.             {    
  89.                 if (names[i] != null)    
  90.                 {    
  91.                     imageCache.put(names[i], Image.createImage("/" + names[i] + ".png"));    
  92.                 }    
  93.             }catch (IOException ioe)    
  94.             {    
  95.                 ioe.printStackTrace();    
  96.             }    
  97.         }    
  98.     }    
  99. }    

客户端使用缓存示例:

Java代码
  1. ImageManager imageManager = ImageManager.getInstance();    
  2. Image image = imageManager.getImage("logo");