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

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

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

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

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

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

package com.xxx.bean;  
02./** 
03. * 文件名:ImageBean.java 
04. * 
05. * 版本信息: 
06. * 日期:2009-10-21 
07. * Copyright xxx Corporation 2009  
08. * 版权所有 
09. * 
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(单例类负责所有本地图片的管理工作 [缓存器的管理类])

/** 
02. * 文件名:ImageManager.java 
03. * 
04. * 版本信息: 
05. * 日期:2009-10-28 
06. * Copyright xxx Corporation 2009  
07. * 版权所有 
08. * 
09. */  
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.     */  
32.    private static Hashtable imageCache = null;  
33.      
34.    /** 
35.     * 饿汉式单例模式,类加载器加载时就有了本类的一个实例,提高了系统效率. 
36.     */  
37.    private static ImageManager instance = new ImageManager();  
38.    /** 
39.     * 私有的构造子,防止被任意调用,保证本类在整个项目中只能有一个实例. 
40.     */  
41.    private ImageManager()  
42.    {  
43.        imageCache = new Hashtable();  
44.    }  
45.    /** 
46.     * 这里提供了一个供外部调用本 class 的静态方法,可以直接访问 
47.     */  
48.    public static ImageManager getInstance()  
49.    {  
50.        return instance;  
51.    }  
52.    /** 
53.     * 登记式缓存器的应用. 
54.     * 如果图片是第一次访问本方法,产生一个实例并返回.同时将此实例加载到缓存器之中 
55.     * 如果图片是第2,3,,,n次访问本方法,直接返回该图片实例,大大提高了系统运行效率 
56.     */  
57.    public Image getImage(String name)  
58.    {  
59.        Image image = null;  
60.        try  
61.        {  
62.            System.out.println("111111111111111");  
63.            if (null == imageCache.get(name))  
64.            {  
65.                System.out.println("222222222222222");  
66.                image = Image.createImage("/" + name + ".png");  
67.                System.out.println("33333333333333333333");  
68.                imageCache.put(name, image);  
69.            }else  
70.            {  
71.                image = (Image)imageCache.get(name);  
72.            }  
73.        }catch (IOException ioe)  
74.        {  
75.            ioe.printStackTrace();  
76.        }  
77.          
78.        return image;  
79.    }  
80.      
81.    /** 
82.     * 批量将一个数组中所有的图片放入缓存器[一般是在 MIDlet 中对缓存器初始化时使用 
83.     */  
84.    public  void loadImagesCache(String[] names)  
85.    {  
86.        for (int i = 0; i < names.length; i++)  
87.        {  
88.            try  
89.            {  
90.                if (names[i] != null)  
91.                {  
92.                    imageCache.put(names[i], Image.createImage("/" + names[i] + ".png"));  
93.                }  
94.            }catch (IOException ioe)  
95.            {  
96.                ioe.printStackTrace();  
97.            }  
98.        }  
99.    }  
100.}  

  

客户端使用缓存示例:

ImageManager imageManager = ImageManager.getInstance();  
Image image = imageManager.getImage("logo");  

  

原文地址:https://www.cnblogs.com/ZenoLiang/p/12701426.html