单例模式
作为一种常见的设计模式,单例模式的设计概念是"两个私有,一个公有",即私有属性/成员变量和私有构造,以及公有方法,常用于在整个程序中仅调用一次的代码。
具体操作
描述
从单例模式的描述来看,单例模式并不能用于多次频繁调用的设计中,而更适用于程序开头,用于读取资源作启动作用的设计,在这里我们使用读取数据库的使用实例做例子。
例代码
package com.mannoroth.utils;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class ConfigManager {
//创建私有属性及成员变量
private static ConfigManager configManager;
private static Properties properties ;
//创建私有构造
private ConfigManager(){
InputStream is = null;
try {
//创建·properties·做Properties对象
properties = new Properties();
is = ConfigManager.class.getClassLoader().getResourceAsStream("database.properties");
properties.load(is);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if (is != null) {
is.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//公有方法,开启一个口使外部程序得以调用
public static ConfigManager getInstance(){
if (configManager == null) {
configManager = new ConfigManager();
}
return configManager;
}
//通过输入key的值,从文件中获得对应的值
public static String getValues(String key){
return properties.getProperty(key);
}
}
单例模式的公有方法存在两个模式,分别为:
1.懒汉模式
//在第一次调用的使用(configManager==null),使自己实例化
public static synchronized ConfigManager getInstance(){
if (configManager==null) {
configManager=new ConfigManager();
}
return configManager;
}
上述模式存在缺点,当该模式被多线程同时使用的时候,有可能会因此出现混乱,使两者交错,这时候我们可以通过使用再添加一重锁定(synchronized)的属性来保证线程安全。
解决方法:使用双重锁定
//在方法调用中再加入一重synchronized属性
public static synchronized ConfigManager getInstance(){
synchronized (ConfigManager.class) {
if (configManager==null) {
configManager=new ConfigManager();
}
}
return configManager;
}
2.饿汉模式
public static ConfigManager getInstance(){
if (configManager==null) {
configManager=new ConfigManager();
}
return configManager;
}
饿汉模式在创建的同时就提供了一个静态对象供程序调用,不会再发生变化,足矣保证现成安全。
两种模式的区别:
饿汉模式:类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在
懒汉模式:只有当调用getInstance的时候,才会去初始化这个单例。