单例模式、懒汉模式以及饿汉模式的区别及应用

1.单例模式
单例模式就是系统运行期间,有且仅有一个实例。它有三个必须满足的关键点:
(1)一个类只有一个实例。这是满足单例模式最基本的要求,若满足这个关键点,只能提供私有的构造器,即保证不能随意创建该类的实例。示例如下:
//读取配置文件的工具类—单例模式
public class Config{
private static Properties properties;
//私有构造器–读取数据库配置文件
private Config(){
String configFile=“dataBase.properties”;
properties =new Properties();
InputStream is=Config.class.getClassLoader().getResourceAsStream(configFile);
try{
properties.load(is);
is.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
在上述代码中,将读取配置文件的I/O操作放入私有构造器,这样可以有效保证I/O操作在整个系统运行期间仅被执行一次,以解决资源消耗问题。
(2)它必须自行创建这个实例。对于这一点,正是体现了:单例模式的有且仅有一个实例这一特性,我们在保证唯一性时,也必须保证提供一个实例,但是需要它自行创建,于是我们在之前的代码中添加一个Config类型的静态私有对象,以便向外界提供该类实例时使用。
示例如下:
//读取配置文件的工具类—单例模式
public class Config{
[color=#FF0000]private static Config config;[/color]
private static Properties properties;
//私有构造器–读取数据库配置文件
private Config(){
String configFile=“dataBase.properties”;
properties =new Properties();
InputStream is=Config.class.getClassLoader().getResourceAsStream(configFile);
try{
properties.load(is);
is.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
(3) 它必须自行向整个系统提供这个实例。
为了能够被其他类获取这个实例,同时又不能自行创建该类的实例,于是我们还有添加一个公有的静态方法,该方法创建或者获取它本身的私有对象并返回。关键代码如下:
//读取配置文件的工具类—单例模式
public class Config{
[color=#FF0000]private static Config config;[/color]
private static Properties properties;
//私有构造器–读取数据库配置文件
private Config(){
String configFile=“dataBase.properties”;
properties =new Properties();
InputStream is=Config.class.getClassLoader().getResourceAsStream(configFile);
try{
properties.load(is);
is.close();
}catch(IOException e){
e.printStackTrace();
}
}
//全局访问点
public static Config getInstance(){
if(confignull){
config=new Config();
}
return config;
}
}
满足以上三点才是一个完整的单例模式,不过在多线程并发的情况下使用单例模式时,它存在严重的弊端,如果线程不安全,很有可能会出现多个config实例,于是我们可以使用懒汉模式来解决多线程并发的问题。
2.懒汉模式即在类加载时不创建实例,采用延迟加载的方式,在运行调用时创建实例,即在上述代码中的全局访问的方法中做如下修改:
//全局访问点
public static synchronized Config getInstance(){
if(config
null){
config=new Config();
}
return config;
}
不过在使用此模式时,虽然解决了线程安全的问题,但是工作效率大大降低,所以我们使用饿汉模式来完善以上缺陷。
3.饿汉模式
饿汉模式即在类加载的时候完成了初始化操作,所以在类加载时较慢,但是获取对象的速度很快。并且由于饿汉模式在类初始化的时候就已经自行实例化了,所以不存在线程安全的问题,但是由于每加载类就要实例化一次对象,导致资源的占用很高,所以我们可以说懒汉模式是用时间换空间而饿汉模式则是用空间换时间。
饿汉模式的示例如下:
public class Config{
[color=#FF0000]private static Config config=new Config();[/color]
private static Properties properties;
//私有构造器–读取数据库配置文件
private Config(){
String configFile=“dataBase.properties”;
properties =new Properties();
InputStream is=Config.class.getClassLoader().getResourceAsStream(configFile);
try{
properties.load(is);
is.close();
}catch(IOException e){
e.printStackTrace();
}
}
//全局访问点
public static Config getInstance(){
return config;
}
}

猜你喜欢

转载自blog.csdn.net/zzybbh/article/details/83068851