------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一. 为什么要使用单例设计模式?
可以保证一个类在内存中的对象唯一性。
比如,程序读取一个配置文件的时候,就可以把配置为文件封装成对象。当要求方便的操作其中的数据,又要保证多个程序读到的是同一个配置文件对象,就需要这个配置文件对象在内存中是唯一的
二. 怎样保证对象唯一性呢?
思路:
1. 让本类的构造函数私有化,这样其他的类就不可以创建本类对象。
2. 在本类中创建一个私有的本类对象。
3. 对外提供方法,让其他的类可以获取这个对象。
3. 单例设计模式的分类:
单例设计模式有两种,一种是懒汉设计模式(又称为延迟加载设计模式),一种是饿汉设计模式。
饿汉设计模式的代码体现如下:
class Single
{
//私有本类中的构造函数
private Single(){}
//创建本类对象
private static Single s= new Single();
//对外提供获取本来对象方法
public static Single getInstance()
{
return s;
}
}
注意问题:
由于外界无法创建Single对象,没有对象,那就无法调用getInstance方法,这时需要将getInstance方法静态化,这样外界就可以通过类名直接调用该方法。
懒汉模式:
public class SingleDemo
{
public static voidmain(String[] args)
{
//获取Single类的实例对象s
Single s = Single.getInstance();
//获取Single类的实例对象s2
Single s2 = Single.getInstance();
System.out.println(s==s2); //true
}
}
class Single
{
//私有构造函数
private Single(){}
//在本类中创建本类对象
private static Single instance = null;
//对外提供静态访问方法,获取本类实例对象
public static Single getInstance()
{
if(instance == null ) // 这里会有线程安全问题
{
instance = new Single();
}
return instance;
}
}
三,总结:
懒汉模式,它的特点是运行时获得对象的速度比较慢,但加载类的时候比较快。它在整个应用的生命周期只有一部分时间在占用资源。
饿汉模式,它的特点是加载类的时候比较慢,但运行时获得对象的速度比较快。它从加载到应用结束会一直占用资源。
从用户体验的角度来说,我们应该首选饿汉模式。我们愿意等待某个程序花较长的时间初始化,却不喜欢在程序运行时等待太久,给人一种反应迟钝的感觉,所以对于有重量级对象参与的单例模式,我们推荐使用饿汉模式
在并发的情况下,懒汉式是不安全的。如果两个线程,我们称它们为线程1和线程2,在同一时间调用getInstance()方法,如果线程1先进入if块,然后线程2进行控制,那么就会有两个实例被创建。
四,懒汉设计模式缺陷的解决方案:我们可以使用线程锁来解决这个问题,代码反映如下:
class Single
{
//私有构造函数
private Single(){}
//在本类中创建本类对象
private static Single instance = null;
//对外提供静态访问方法,获取本类实例对象
public static Single getInstance()
{
if(instance == null)
{
synchronized(Single.class)
{
if(instance == null )
{
instance = new Single();
}
}
}
return instance;
}
}