码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式--单例模式

时间:2016-09-01 20:10:33      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

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;
    }
}

 

设计模式--单例模式

标签:

原文地址:http://www.cnblogs.com/fifiyong/p/5831033.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!