单例模式有两种
1.饿汉式
class Bank{
//私有化类的构造器
private Bank(){
}
//内部创建类的对象:调用内部private的构造方法
private static Bank instance = new Bank();
//提供公共的方法,返回类的对象
public static Bank getInstance(){
return instance;
}
}
2.懒汉式(可以用synchronized使他成为线程安全)
class Order{
//私有化构造方法
private Order() {
}
//声明当前类,没有初始化
private static Order instance = null;
public static Order getInstance(){
if (instance==null){
instance = new Order();
}
return instance;
}
}
我们观察他们的代码就可以知道,单例模式的意义就是采取一定的方法保证整个软件系统中,对某个类只能存在一个对象实例。
而它们的区别,就是饿汉式在一开始就把对象给创建好了,而懒汉式只有在需要创建的时候并且之前没有这个对象的时候才会创建。所以饿汉式的加载时间过长,而懒汉式延迟了对象的创建,效率更高。可饿汉式就一无是处吗?当然不是,饿汉式是线程安全的,类里的属性就像我们银行取钱一样,不会因为多个人同时取钱而让本来只有500的账号同时被取500。
那么单例模式能用在哪里呢?网站上的计数器,数据库连接等,这些操作只需要一个对象,使用单例模式能有效的减少内存消耗,提高效率
扩展:
1.饿汉式(线程安全,调用效率高,但是不能延时加载);
2.懒汉式(加上线程锁可以线程安全,调用效率不高,但是能延时加载);
3.Double CheckLock实现单例:DCL也就是双重锁判断机制(由于JVM底层模型原因,偶尔会出问题,不建议使用);
4.静态内部类实现模式(线程安全,调用效率高,可以延时加载);
5.枚举类(线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用)。