单例模式
单例模式
单例模式就是系统运行期间,有且仅有一个实例.
它有三个必须满足的关键点:
1、一个类只有一个实例。
2、它必须自行创建这个示例。
3、它必须自行向整个系统提供这个实例。
public class ConfigManager {
private static Properties properties;
private static ConfigManager configManager;
public ConfigManager() {
String configFile = "data.properties";
properties = new Properties();
InputStream is = ConfigManager.class.getClassLoader().getResourceAsStream(configFile);
try {
properties.load(is);
is.close();
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
public static ConfigManager getInstance() {
if(configManager==null) {
configManager=new ConfigManager();
}
return configManager;
}
public String getValue(String key) {
return properties.getProperty(key);
}
懒汉模式
性质:“时间换空间”
在前一个单例模式中,可能会存在多个类同时访问,而导致数据出现差错不一致。
那么,这里采用了懒汉模式,即在类加载时不初始化,需要时调用getInstance()。
///加锁过程
public static synchronized ConfigManager getInstance() {
if(configManager==null) {
configManager=new ConfigManager();
}
return configManager;
}
饿汉模式
性质:“空间换时间”
饿汉模式是指在类加载的时候就完成了初始化操作,故类加载较慢,但是获取对象的速度很快,并且由于饿汉模式是在类初始化时就已经自行实例化,因此它肯定不存在线程不安全问题。
private static ConfigManager configManager =new ConfigManager();
public static synchronized ConfigManager getInstance() {
return configManager;
}
类类型
静态内部类实现单利的方式比以上两种实现方式都要好一些,即实现了线程安全,又避免了同步带来的性能影响.
public class Singleton {
private static Singleton singleton;
private Singleton() {
//整个应用期间,只执行一次的业务代码操作(如读取配置文件的操作)
}
public static class SingletonHelper{
private static final Singleton INSTANCE =new Singleton();
}
public static Singleton getInstance() {
singleton=SingletonHelper.INSTANCE;
return singleton;
}
public static Singleton test() {
return singleton;
}
}