单例模式的使用场景

单例模式

  我曾经做过一个文件上传的功能,文件上传需要限制的文件大小,文件类型等等都可以使用properties去设置,这个思想可以参照数据库连接池的配置,每当我们的客户进行文件上传的时候,我们都必须提取这个peoperties文件中的属性来使用,当我们提取出来后存放在内存中时,这个时候问题产生了,如果每次请求过来都需要创建一个对象的话,内存消耗会很大,我们只要把这个对象设计成单例就可以了。那么每次拿出来的时候,都会只拿到这一个对象了,但是要注意多线程并发的线程安全问题。

  工程结构:

    

  1)创建单例模式的类封装properties的属性值

    

 1 package com.sky.util;
 2
 3 import java.util.HashMap;
 4 import java.util.Map;
 5
 6 public class PropertiesUtil {
 7     private Map<String, String> properties = new HashMap<String, String>();
 8
 9     private static PropertiesUtil instance = new PropertiesUtil();
10
11     private PropertiesUtil(){}
12
13     public static PropertiesUtil getInstance(){
14         return instance;
15     }
16
17     public void addProperty(String propertyName, String propertyValue){
18         properties.put(propertyName, propertyValue);
19     }
20
21     public String getProperty(String propertyName){
22         return properties.get(propertyName);
23     }
24 }

  2)创建监听器初始化properties文件并将参数传给PropertiesUtil类

 1 package com.sky.listener;
 2
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.util.Map;
 6 import java.util.Properties;
 7
 8 import javax.servlet.ServletContextEvent;
 9 import javax.servlet.ServletContextListener;
10
11 import com.sky.util.PropertiesUtil;
12
13 public class FileUploadListener implements ServletContextListener{
14
15     @Override
16     public void contextDestroyed(ServletContextEvent arg0) {
17
18     }
19
20     @Override
21     public void contextInitialized(ServletContextEvent arg0) {
22         InputStream in = getClass().getClassLoader().getResourceAsStream("/info.properties");
23
24         Properties properties = new Properties();
25         try {
26             properties.load(in);
27
28             for(Map.Entry<Object, Object> prop: properties.entrySet()){
29                 String propertyName = (String) prop.getKey();
30                 String propertyValue = (String) prop.getValue();
31
32                 PropertiesUtil.getInstance().addProperty(propertyName, propertyValue);
33             }
34
35         } catch (IOException e) {
36             e.printStackTrace();
37         }
38     }
39
40 }

  3)创建servlet测试参数是否正确

 1 package com.sky.servlet;
 2
 3 import java.io.IOException;
 4
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9
10 import com.sky.util.PropertiesUtil;
11
12 public class FileUplodServlet extends HttpServlet{
13     /**
14      *
15      */
16     private static final long serialVersionUID = -3372491275711404747L;
17
18     @Override
19     protected void doPost(HttpServletRequest request, HttpServletResponse response)
20             throws ServletException, IOException {
21         String exts = PropertiesUtil.getInstance().getProperty("exts");
22         String Maxsize = PropertiesUtil.getInstance().getProperty("file.max.size");
23         String totalMaxSize = PropertiesUtil.getInstance().getProperty("total.file.max.size");
24
25         System.out.println("exts : " + exts);
26         System.out.println("Maxsize : " + Maxsize);
27         System.out.println("totalMaxSize : " + totalMaxSize);
28     }
29 }

  4)web.xml的配置

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="3.0"
 3     xmlns="http://java.sun.com/xml/ns/javaee"
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
 6     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
 7   <display-name></display-name>
 8   <welcome-file-list>
 9     <welcome-file>index.jsp</welcome-file>
10   </welcome-file-list>
11   <listener>
12       <listener-class>com.sky.listener.FileUploadListener</listener-class>
13   </listener>
14   <servlet>
15       <servlet-name>upload</servlet-name>
16       <servlet-class>com.sky.servlet.FileUplodServlet</servlet-class>
17   </servlet>
18   <servlet-mapping>
19       <servlet-name>upload</servlet-name>
20       <url-pattern>/upload</url-pattern>
21   </servlet-mapping>
22 </web-app>

  5)发布验证结果

  

单例模式往往在于你只需要一个对象,例如windows的task窗口,我往往喜欢使用单例来节约对象,这也算是多种设计模式中最简单的一种了。

时间: 2024-10-13 11:47:13

单例模式的使用场景的相关文章

设计模式之——单例模式(Singleton)的常见应用场景(转):

单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此有些设计大师并把把其称为设计模式之一. 这里又不具体讲如何实现单例模式和介绍其原理(因为这方便的已经有太多的好文章介绍了),如果对单例模式不了解的可以先看下:http://terrylee.cnblogs.com/archive/2005/12/09/293509.html . 好多没怎么使用过的人

单例模式的常见应用场景

单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此有些设计大师并把把其称为设计模式之一. 这里又不具体讲如何实现单例模式和介绍其原理(因为这方便的已经有太多的好文章介绍了),如果对单例模式不了解的可以先看下:http://terrylee.cnblogs.com/archive/2005/12/09/293509.html .当然也可以自己搜索.

(转)单例模式(Singleton)的常见应用场景

转自:http://blog.csdn.net/likika2012/article/details/11483167 单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此有些设计大师并把把其称为设计模式之一. 这里又不具体讲如何实现单例模式和介绍其原理(因为这方便的已经有太多的好文章介绍了),如果对单例模式不了解的可以先看下:http://terr

(转)设计模式之——单例模式(Singleton)的常见应用场景

单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此有些设计大师并把把其称为设计模式之一. 这里又不具体讲如何实现单例模式和介绍其原理(因为这方便的已经有太多的好文章介绍了),如果对单例模式不了解的可以先看下:http://terrylee.cnblogs.com/archive/2005/12/09/293509.html .当然也可以自己搜索.

单例模式应用场景

1. Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗? 不信你自己试试看哦~ 2. windows的Recycle Bin(回收站)也是典型的单例应用.在整个系统运行过程中,回收站一直维护着仅有的一个实例. 3. 网站的计数器,一般也是采用单例模式实现,否则难以同步. 4. 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例

「设计模式」JavaScript - 设计模式之单例模式与场景实践

单例介绍 上次总结了设计模式中的module模式,可能没有真真正正的使用在场景中,发现效果并不好,想要使用起来却不那么得心应手, 所以这次我打算换一种方式~~从简单的场景中来看单例模式, 因为JavaScript非常灵活,所以在使用设计模式的时候也带来了很强的灵活性,实现单例的方法也有很多,那就需要我们把握住单例模式的核心. 单例模式介绍: 单例模式是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象. 在Ja

PHP设计模式之单例模式

一.什么是单例模式 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例.即一个类只有一个对象实例 单例模式的应用场景 通常用来数据库连接,日志写入等方面,为了减少资源浪费,减少数据库连接次数,节约资源,提高效率. 三.如何实现 要实现单例模式其实挺简单的,总结起来就一句话:三私一公,四个步骤: 1.私有化构造方法 2.声明一个公开的静态方法用来创建实例 3.声明一个私有的静态变量用来存储第二步创建的实例 4.私有化克隆方法

单例模式和工厂方法模式

单例模式的定义 单例模式(Singleton Pattern)是一个比较简单的模式,其定义如下: Ensure a class has only one instance, and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.) 单例模式通用代码 public class Singleton { private static final Singleton singleton = new Sin

设计模式系列(一)单例模式

一.用通俗的语言解释其意义:从秦始皇之后确立了皇帝的位置,且同一时期只有一个.因此大家在称呼的时候不需要为皇帝加上其他的前缀.这一过程反应在设计领域就是,要求一个类只能生成一个对象,所有对象对他的依赖都是相同的,因为只有一个对象,所以对象对他的依赖都是相同的,因为只有一个对象,大家对他都很了解.皇帝每天要处理很多的事情,但是皇帝只有一个,即一个类只有一个对象,对象产生通过new关键字完成,我们可以使用构造函数来控制,因为使用new关键字创建对象时都会根据输入的参数调用相应的构造函数,所以如果我们