单例模式

为什么要使用单例?

在我刚接触的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的实战,让我更加深入的走进了单例模式的。其实无论是做人还是做事都应该向单例一样,一心一意。

评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值