个人总结了下单列模式,如有不到之处还望多多指教。
单列模式是开发和面试过程中常会被问到的设计模式,单列模式用在设计一些工具类的时候可能会被频繁调用时。比如说一个网站统计在线人数,把一个计数器存放在内存或者数据库中,当有人登陆的时候取出来加一再放回去,有人退出登陆的时候取出来减一再放回去,但是当有两个人同时登陆的时候,会同时取出计数器,同时加一,同时放回去,这样的话数据就会错误,所以需要一个全局变量的对象给全部人使用,只需要new出一个实例对象,这就是单例模式的应用,并且单例模式节省资源,因为它控制了实例对象的个数,并有利于gc回收。
单列的好处:是为了节省重复创建对象所带来的内存消耗,从而提高效率。
单列设计模式:
1、构造方法私有化
2、声明一个本类的对象
3、给外部提供一个静态方法获取对象实例
两种单列模式:
1.饿汉式:在类加载后,对象被创建,到程序结束后释放。
缺点:占用内存时间长
优点:提高效率
2.懒汉式:在第一次调用方法时,对象被创建,到程序结束后释放。
缺点:效率低些(相对饿汉式)
优点:占用内存时间短(相对饿汉式)
饿汉式代码:
public class Test {
public static void main(String[] args) {
Singleton1 s = Singleton1.getInstance();
s.print();
}
}
/**
* 饿汉式
*/
class Singleton1{
private Singleton1(){}
private static Singleton1 s = new Singleton1();
public static Singleton1 getInstance(){
return s;
}
public void print(){
System.out.println("测试方法,饿汉式!");
}
}
懒汉式代码:
public class Test {
public static void main(String[] args) {
Singleton2 s = Singleton2.getInstance();
s.print();
}
}
/**
* 懒汉式
*/
class Singleton2{
private Singleton2(){}
private static Singleton2 s;
public static Singleton2 getInstance(){
if(s==null){
s = new Singleton2();
}
return s;
}
public void print(){
System.out.println("测试方法,懒汉式!");
}
}
注:
可以使用构造方法私有化+静态方法来代替单列模式。但是推荐使用单列模式,因为从内存的角度来考虑,单列模式占用内存相对较小。