10.1 单例模式
单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点以供外部代码使用。以下是关于单例模式的详细解析:
一、定义与特点
- 定义:单例模式指一个类只有一个实例,且该类能自行创建这个实例的一种模式。
- 特点:
- 类只有一个实例。
- 该类自行创建这个实例。
- 该类向整个系统提供这个实例的访问点。
1.加载配置数据
数据库配置信息存储于database,properties配置文件中,具体配置信息如下所示
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql:///cvs_db?serverTimezone=GMT-8
username=root
password=liuyuhan
Basedao类中Init()方法负责从database.properties配置文件中加载配置信息
2.获取数据库的连接对象
使用Connection getConnection()方法获取数据库连接,返回Connection示例。
3.处理查询操作
ResultSet execute(Connection,ProparedStatement,ResultSet,String,Object[])方法:负责根据传入的参数完成数据的查询操作,返回结果集ResultSet。
4.处理增、删、改操作
使用 int execute(Connection,ProparedStatement,String,Object[])方法根据传入的参数完成数据的更新(增、删、改)操作,返回影响的行数。
5.关闭数据库连接
使用boolean closeResource(Connection,ProparedStatement,ResultSet)方法,负责根据传入的参数进行相应资源的关闭操作,返回boolean值。
这里可以用单例模式的思想来解决,把读取数据库配置文件的操作提前到一个工具类中,并把该工具类设计为单例模式。实现单例模式必须满足三个关键点:一个类只有一个实例,自行创建实例对象,对外提供实例对象,下面分别进行讲解。
1.一个类只有一个实例
单例模式即一个类只能有一个实例,要满足这个关键点,就不能允许外界随意创建该类的实例,可以通过私有化构造方法达到这一目的,在com.bdqn.utils包下创建ConfigManager.java,关键代码如下:
package com.bdqn.utils;
import org.junit.platform.commons.function.Try;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class ConfigManager {
// 在类加载时即创建ConfigManager实例
private static Properties properties;
// 杜绝了外界创建该类对象,私有构造方法
private ConfigManager(){
String configFile = "database.properties";
properties = new Properties();
//得到当前类的类加载器并将配置文件加载到输入流中
InputStream is = ConfigManager.class.getClassLoader().getResourceAsStream(configFile);
try {
// 从输入流中读取属性列表
properties.load(is);
is.close();
}catch (IOException e){
e.printStackTrace();
}
}
通过私有化构造方法,杜绝了外界创建该类实例的功能。把读取配置文件的I/O操作代码放到私有构造方法中,可有效地保证I/O操作在整个系统运行期间仅被执行一次,可大大减少资源的消耗。
2.自行创建实例对象
既然外界不可以创建该类的实例,那么就需要在该类内部创建一个实例,关键代码如下:
package com.bdqn.utils;
import org.junit.platform.commons.function.Try;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class ConfigManager {
// 在类加载时即创建ConfigManager实例
private static ConfigManager configManager = new ConfigManager();
private static Properties properties;
// 杜绝了外界创建该类对象,私有构造方法
private ConfigManager(){
String configFile = "database.properties";
properties = new Properties();
//得到当前类的类加载器并将配置文件加载到输入流中
InputStream is = ConfigManager.class.getClassLoader().getResourceAsStream(configFile);
try {
// 从输入流中读取属性列表
properties.load(is);
is.close();
}catch (IOException e){
e.printStackTrace();
}
}