要说单例的设计模式,我们首先就要知道什么是设计模式?设计模式就是我们解决问题的一种行之有效的思想。通过设计模式可以让我们更加高效的去解决某种或者是某类问题。
单例设计模式是众多设计模式中的一种。单例在我们的程序中就是单个对象。单例设计模式所解决的问题是:它保证了一个类在内存中只能有一个对象。例如多程序访问同一个配置文件时,我们希望多程序操作的都是同一个配置文件中的数据,这时就需要保证此配置文件唯一。我们可以通过两种方法完成,第一种就是将数据静态修饰,那么多程序就可以共享这些数据了。但是这些方法一旦静态后,它们的生命周期会很长。第二种就是用到我们的单例设计模式,保证对象的唯一性,从而保证数据的唯一。
单例设计模式的实现步骤:
1、为了不让其它程序该类的对象,需要将该类的构造函数私有化。
2、在本类中创建一个本类对象。
3、定义一个方法,其返回值是本类类型,让其它程序通过该方法就可以获取到该类对象。此方法应该是静态的,因为调用方法有两种方式,第一种是通过创建对象调用方法,但由于我们的构造函数被私有化,所以不能用此种方法。第二种就是通过类名调用,此时方法就必须是静态的。
单例设计模式分两种:
第一种:饿汉式
代码体现:
class Single{
private static Single s = new Single();
private Single(){}
public static Single getInstance(){
return s;
}
}
第二种:懒汉式(单例的延迟加载模式)
代码体现:class Single{
private static Single2 s = null;
private Single2(){}
public static Single2 getInstance(){
if(s==null)
s=new Single2();
return s;
}
}
饿汉式相对于懒汉式来说,它的缺点是:饿汉式一来就要创建对象,而懒汉式是用到时才创建对象。所以,懒汉式更占用内存。
开发时,我们一般用饿汉式。为什么不用懒汉式了?
因为懒汉式存在着一定的安全隐患,在多线程中涉及到了线程间的切换,懒汉式会出现并发访问的情况。
解决并发访问的方法就是加入同步,这时就需要加入锁,在程序运行时就要去判断锁,效率相对于饿汉式来说稍微低了一点。
在懒汉式中,如果我们加入的是同步函数,可以解决安全问题,但是要去判断锁,判断的次数增加,就会降低性能。所以我们使用的是同步代码块,
并用双重判断,就可以提高性能了。
在同步中,我们需要注意的是:同步中的锁不能用this,因为函数时静态的,不能用this,而是用 .class这个字节码文件。