单例模式

单例模式:一个类只能创建一个对象

场景:对于一些配置文件,数据操作的对象

5种常见单例

(1)饿汉式单例:在初始时new静态对象,缺点,不支持延时加载

(2)懒汉式单例:在getinstance中new 静态对象,加了锁,性能不好,支持延时加载

(3)双重检查单例:

public class IdGenerator {
    private static IdGenerator Single;
<pre><code>private IdGenerator() {

}

public synchronized IdGenerator getInstance() {
    if (Single == null) {
        synchronized (IdGenerator.class) {
            if (Single == null) {
                Single = new IdGenerator();
            }
        }
    }
    return Single;
}

}

支持延时加载,低版本java,由于指令重排序,可能Single还没有初始化好,其他线程就在使用了,可以加 volatile关键字解决,高版本已经没有问题了

(4)静态内部类单例

public class IdGenerator {</p>
<pre><code>private IdGenerator() {

}

public static class Single {
    private static IdGenerator idGenerator = new IdGenerator();
}

public static IdGenerator getIdGenerator() {
    return Single.idGenerator;
}

}

支持延时加载,性能好

(5)枚举式单列

public enum IdGenerator {
INSTANCE;
private AtomicInteger atomicInteger = new AtomicInteger();</p>
<pre><code>public int getid() {
    return  atomicInteger.get();
}

}

支持延时加载,性能好

单例模式的缺点:

1.对OOP特性支持不友好

2.隐藏类之间依赖关系

3.对代码拓展性不好

4.对单元测试不友好

5.不支持有参数的构造函数