您的位置:首页 > 编程语言 > Java开发

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

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

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

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

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

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

复制到剪贴板  Java代码
package com.xxx.bean;    

/**   

 * 文件名:ImageBean.java   

 *   

 * 版本信息:   

 * 日期:2009-10-21   

 * Copyright xxx Corporation 2009    

 * 版权所有   

 *   

 */    

/**   

 *    

 * 项目名称:Test   

 * 类名称:ImageBean   

 * 类描述:封装下载的图片的 Javabean.   

 * 创建人:Defonds   

 * 创建时间:2009-10-21 上午11:30:45   

 * 修改人:Defonds   

 * 修改时间:2009-10-21 上午11:30:45   

 * 修改备注:   

 * @version    

 *    

 */    

public class ImageBean    

{    

    //------------------------------------------------------    

    //fields.    

        

    /**   

     *  地图图片的横坐标.   

     */    

    private int abscissa;    

        

    /**   

     *  地图图片的纵坐标.   

     */    

    private int ordinate;    

        

    /**   

     *  要下载地图的 http url 链接地址.   

     */    

    private String url;    

        

    /**   

     *  下载的图片的字节流.   

     */    

    private byte[] byteOfImage;    

    //--------------------------------------------------------------------    

    //The getters and setters.    

        

    public int getAbscissa()    

    {    

        return abscissa;    

    }    

    public void setAbscissa(int abscissa)    

    {    

        this.abscissa = abscissa;    

    }    

    public int getOrdinate()    

    {    

        return ordinate;    

    }    

    public void setOrdinate(int ordinate)    

    {    

        this.ordinate = ordinate;    

    }    

    public String getUrl()    

    {    

        return url;    

    }    

    public void setUrl(String url)    

    {    

        this.url = url;    

    }    

    public byte[] getByteOfImage()    

    {    

        return byteOfImage;    

    }    

    public void setByteOfImage(byte[] byteOfImage)    

    {    

        this.byteOfImage = byteOfImage;    

    }    

        

}    

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

复制到剪贴板  Java代码
/**   

 * 文件名:ImageManager.java   

 *   

 * 版本信息:   

 * 日期:2009-10-28   

 * Copyright xxx Corporation 2009    

 * 版权所有   

 *   

 */    

package com.xxx.util;    

import java.io.IOException;    

import java.util.Hashtable;    

import javax.microedition.lcdui.Image;    

/**   

 *    

 * 项目名称:Basic1.0   

 * 类名称:ImageManager   

 * 类描述:单例类负责所有本地图片的管理工作 [缓存器的管理类]   

 * 创建人:Defonds   

 * 创建时间:2009-10-28 上午11:32:43   

 * 修改人:Defonds   

 * 修改时间:2009-10-28 上午11:32:43   

 * 修改备注:   

 * @version    

 *    

 */    

public class ImageManager    

{    

    /**   

     * 缓存器.专门用来存放程序中用到的图片.   

     */         private static Hashtable imageCache = null;    

        

    /**   

     * 饿汉式单例模式,类加载器加载时就有了本类的一个实例,提高了系统效率.   

     */    

    private static ImageManager instance = new ImageManager();    

    /**   

     * 私有的构造子,防止被任意调用,保证本类在整个项目中只能有一个实例.   

     */    

    private ImageManager()    

    {    

        imageCache = new Hashtable();    

    }    

    /**   

     * 这里提供了一个供外部调用本 class 的静态方法,可以直接访问   

     */    

    public static ImageManager getInstance()    

    {    

        return instance;    

    }    

    /**   

     * 登记式缓存器的应用.   

     * 如果图片是第一次访问本方法,产生一个实例并返回.同时将此实例加载到缓存器之中   

     * 如果图片是第2,3,,,n次访问本方法,直接返回该图片实例,大大提高了系统运行效率   

     */    

    public Image getImage(String name)    

    {    

        Image image = null;    

        try    

        {    

            System.out.println("111111111111111");    

            if (null == imageCache.get(name))    

            {    

                System.out.println("222222222222222");    

                image = Image.createImage("/" + name + ".png");    

                System.out.println("33333333333333333333");    

                imageCache.put(name, image);    

            }else    

            {    

                image = (Image)imageCache.get(name);    

            }    

        }catch (IOException ioe)    

        {    

            ioe.printStackTrace();    

        }    

            

        return image;    

    }    

        

    /**   

     * 批量将一个数组中所有的图片放入缓存器[一般是在 MIDlet 中对缓存器初始化时使用   

     */    

    public  void loadImagesCache(String[] names)    

    {    

        for (int i = 0; i < names.length; i++)    

        {    

            try    

            {    

                if (names[i] != null)    

                {    

                    imageCache.put(names[i], Image.createImage("/" + names[i] + ".png"));    

                }    

            }catch (IOException ioe)    

            {    

                ioe.printStackTrace();    

            }    

        }    

    }    

}    

客户端使用缓存示例:

复制到剪贴板  Java代码
ImageManager imageManager = ImageManager.getInstance();    

Image image = imageManager.getImage("logo");   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息