首页 > 代码库 > 设计模式--单例模式
设计模式--单例模式
package com.wuyong.util;import java.io.InputStream;import java.util.Properties;/** * * @author wuyong * @email 382999338@qq.com * @date2016年9月1日下午6:59:33 * * *读取配置文件的工具类---单列模式---懒汉模式--延迟加载 * * 步骤: * * 1.创建私有的构造器,进行配置文件的读取 * 2.创建全局访问点,通过单列模式设置实列化的个数,返回configManager实列 * 3.通过key获得对应的value */public class ConfigManager { private static ConfigManager configManager; private static Properties properties;//Properties用来操作properties文件 //私有的构造器,进行配置文件的读取 private ConfigManager(){ String configFile="jdbc.properties"; properties=new Properties(); try { //通过classpath找资源 //在当前类所在包的根目录下找到相应的configFile文件 //getClassLoader()返回类加载器 //getResourceAsStream(configFile)返回InputStream对象 InputStream is=ConfigManager.class.getClassLoader().getResourceAsStream(configFile); properties.load(is);//读取配置文件 is.close(); } catch (Exception e) { // TODO: handle exception } } /* *线程不安全,在并发环境下,很有可能会出现多个configManager实列 *需要考虑同步 , 可以加同步锁 synchronized * 懒汉模式 (线程不安全--解决办法1.方法体加同步锁synchronized 2.双重校验锁) * 在类加载的时候不创建实列,运行的时候创建。 * 优点:类加载快 * 缺点:效率低,在运行时获取对象速度慢 * * */ //全局访问点 //通过单列模式设置实列化的个数 public static synchronized ConfigManager getInstance(){ if (configManager==null) { configManager=new ConfigManager(); } return configManager; } //通过key获得对应的value public String getValue(String key){ return properties.getProperty(key); } /*//双重校验锁 private static ConfigManager cManager; //私有的构造器 private ConfigManager(){ String configFile="database.properties"; properties=new Properties(); try { //通过classpath找资源 //在当前类所在包的根目录下找到相应的configFile文件 InputStream is=ConfigManager.class.getClassLoader().getResourceAsStream(configFile); properties.load(is); is.close(); } catch (Exception e) { // TODO: handle exception } } public static ConfigManager getInstance(){ if (cManager==null) { synchronized(ConfigManager.class){ if (cManager==null) { cManager=new ConfigManager(); } } } return cManager; }*/}
package com.wuyong.util;import java.io.InputStream;import java.util.Properties;/** * * @author wuyong * @email 382999338@qq.com * @date2016年9月1日下午7:02:16 * 单列模式---饿汉模式:(线程安全)在类加载的时候,就完成初始化。所以累加载慢,但在运行时获取对象快 */public class ConfigManager2 { //类加载的时候,自动进行初始化 private static ConfigManager2 configManager2=new ConfigManager2(); private static Properties properties; //私有的构造器 private ConfigManager2(){ String configFile="database.properties"; properties=new Properties(); try { //通过classpath找资源 //在当前类所在包的根目录下找到相应的configFile文件 InputStream is=ConfigManager.class.getClassLoader().getResourceAsStream(configFile); properties.load(is); is.close(); } catch (Exception e) { // TODO: handle exception } } /* * * 饿汉模式:(线程安全) * 在类加载的时候,就完成初始化。所以l类加载慢,但在运行时获取对象快 */ //全局访问点 public static ConfigManager2 getInstance(){ return configManager2; } public String getValue(String key){ return properties.getProperty(key); } }
上面的两个工具类用在JDBC连接数据库时,工具类创建configManager实列,通过configManager实列获取数据库连接。
在BaseDao中
package com.wuyong.dao;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import com.wuyong.util.ConfigManager;/** * * @author wuyong * @email 382999338@qq.com * @date2016年9月1日下午7:23:14 *//* * 操作数据库的基类---静态类 * * 方法: * 1.获取数据库连接:public static Connection getConnection() * 步骤: * 获取porperties文件,的value值 * 加载类的驱动 * 获取连接 * 返回连接 * * 2.查询操作:public static ResultSet execute(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet,String sql,Object[] params) throws SQLException 步骤: 执行SQL 接收结果集 返回结果集 3.更新操作: public static int execute(Connection connection,PreparedStatement preparedStatement,String sql,Object[] params) throws Exception 步骤: 执行SQL 接收影响的行数 返回影响的行数 4.关闭资源:public static boolean closeResource(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet) * 步骤: * 关闭资源 * GC回收 * 返回falg */public class BaseDao { //获取数据库连接 public static Connection getConnection(){ String driver=ConfigManager.getInstance().getValue("driver"); String url=ConfigManager.getInstance().getValue("url"); String username=ConfigManager.getInstance().getValue("username"); String password=ConfigManager.getInstance().getValue("password"); Connection connection=null; //类加载 try { Class.forName(driver); connection=DriverManager.getConnection(url,username,password); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return connection; } //关闭资源 public static boolean closeResource(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet){ boolean flag=true; if (resultSet!=null) { try { resultSet.close(); resultSet=null;//GC回收 } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); flag=false; } } if (preparedStatement!=null) { if (preparedStatement!=null) { try { preparedStatement.close(); preparedStatement=null;//GC回收 } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); flag=false; } } if (connection!=null) { try { connection.close(); connection=null;//GC回收 } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); flag=false; } } } return flag; } //查询操作 public static ResultSet execute(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet,String sql,Object[] params) throws SQLException{//dao层的异常要抛出,在service层接收 preparedStatement=connection.prepareStatement(sql); for (int i = 0; i < params.length; i++) { preparedStatement.setObject(i+1, params[i]); } resultSet=preparedStatement.executeQuery(); return resultSet; } //更新操作 public static int execute(Connection connection,PreparedStatement preparedStatement,String sql,Object[] params) throws Exception{ int updateRows=0; preparedStatement=connection.prepareStatement(sql); for (int i = 0; i < params.length; i++) { preparedStatement.setObject(i+1, params[i]); } updateRows=preparedStatement.executeUpdate(); return updateRows; }}
设计模式--单例模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。