为什么要使用单例?
在我刚接触的DRP这一块来说,他整个是在对Oracle数据库配置这一块用了单例。由于数据库配置这一块一旦确定好了,就不轻易发生变化。而且在整个程序内,这个数据库连接对象都是一样的,没有必要多次实例化,节约内存。
单例模式的要点:
私有的静态成员变量
私有的构造方法
公共的静态入口方法
种类:
饿汉式单例
懒汉式单例
区别:饿汉式单例是一上来就实例化一个对象,例如:privatestatic XmlConfigReader instance = new XmlConfigReader();占据一块内存,懒汉式单例则是在需要的 时候(在构造方法里)进行实例化,所以又叫做延迟加载。例如:private static XmlConfigReader instance = null;
两者的缺点:
饿汉式单例:消耗内存
懒汉式单例:多个线程同时操作的时候,极易破坏单例模式,需要加锁才能保证单例,因此会有损效率。
实战:
package com.bjpowernode.drp.util; import java.io.InputStream; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class XmlConfigReader { //单例模式(私有的静态的成员变量,私有的构造方法,公共的静态的入口方法) //饿汉式单例 /* private static XmlConfigReader instance = new XmlConfigReader(); private XmlConfigReader(){ } public static XmlConfigReader getInstance(){ return instance; }*/ //懒汉式单例(延迟加载) private static XmlConfigReader instance = null; private JdbcConfig jdbcConfig = new JdbcConfig(); private XmlConfigReader(){ SAXReader reader = new SAXReader(); //通过当前线程加载资源 InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-conf.xml"); try{ //取得jdbc的相关配置信息 Document doc = reader.read(in); Element driverNameElt = (Element)doc.selectObject("/config/db-info/driver-name"); String driverName = driverNameElt.getStringValue(); Element urlElt = (Element)doc.selectObject("/config/db-info/url"); Element userNameElt = (Element)doc.selectObject("/config/db-info/username"); Element passwordElt = (Element)doc.selectObject("/config/db-info/password"); //设置jdbc的相关配置 jdbcConfig.setDriverName(driverNameElt.getStringValue()); jdbcConfig.setUrl(urlElt.getStringValue()); jdbcConfig.setUserName(userNameElt.getStringValue()); jdbcConfig.setPassword(passwordElt.getStringValue()); }catch(DocumentException e){ e.printStackTrace(); } } public static synchronized XmlConfigReader getInstance(){ if(instance == null){ instance = new XmlConfigReader(); } return instance; } /** * 返回jdbc的相关配置 * @return */ public JdbcConfig getJdbcConfig(){ return jdbcConfig; } public static void main(String[] args){ JdbcConfig jdbcConfig = XmlConfigReader.getInstance().getJdbcConfig(); System.out.println(jdbcConfig); } }
小结:
很开心这次又遇到了单例模式,之前在大话设计的时候只是浅浅的停留在了理论上认识了它,这次DRP的实战,让我更加深入的走进了单例模式的。其实无论是做人还是做事都应该向单例一样,一心一意。