设计模式

列举一些JDK中用到的设计模式?

列举一些Spring当中用到的设计模式?

项目中有用过设计模式吗?

单例模式有哪些实现方式?

懒汉式

public class Singleton {
    private static Singleton uniqueInstance;

    private Singleton() {
    }

    public static Singleton getUniqueInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}

说明:先不创建实例,当第一次被调用的时候,再创建实例,所以被称为懒汉式。

优点:延迟了实例化,如果不需要使用该类,就不会被实例化,节约了系统资源。

缺点:线程不安全,如果多个线程同时进入了if(uniqueInstance == null),若此时还未实例化,就会有多个线程同时执行uniqueInstance = new Singleton(),会实例化多个对象。

饿汉式

public class Singleton {
    private static Singleton uniqueInstance = new Singleton();

    private Singleton() {
    }

    public static Singleton getUniqueInstance() {
        return uniqueInstance;
    }
}

说明:

优点:

缺点:

双重检查锁

public class Singleton {

    private volatile Singleton uniqueInstance;

    private Singleton() {}

    public Singleton getInstance() {
        if (null == this.uniqueInstance) {
           synchronized (Singleton.class) {
              if (null == this.singleDemo) {
                    uniqueInstance = new Singleton();
                }
            }
        Singleton = new Singleton();
        return uniqueInstance;
    }
}

说明:

优点:

缺点:

静态内部类

public class Singleton {

    private Singleton() {
    }

    public static Singleton getUniqueInstance() {
        return SingletonHolder.uniqueInstance;
    }

    private static class SingletonHolder {
        private static final Singleton uniqueInstance = new Singleton();
    }
}

说明:

优点:延迟实例化,节约了资源,且线程安全,性能也提高了。

枚举类

public enum Singleton {

    UNIQUE_INSTANCE;

    // 添加自己需要的操作
    public void doSomething() {

    }
}

说明:枚举类的实例就是线程安全的,且在任何情况下都是单例的。

优点:写法简单且线程安全。

单例模式有什么应用场景?

  • 数据库连接池
  • 线程池
  • 网站计数器
  • 应用的配置