设计模式分为三种类型,共23种
- 创建型模式(5种):单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式。
- 结构型模式(7种):适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
- 行为型模式(11种):模板方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)。
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
单例模式8种方式:
- 饿汉式(静态常量)(推荐使用)
- 饿汉式(静态代码块)
- 懒汉式(线程不安全)
- 懒汉式(线程安全,同步方法)
- 懒汉式(线程安全,同步代码块)
- 双重检查(推荐使用)
- 静态内部类(推荐使用)
- 枚举(推荐使用)
这里只展示推荐使用的实现方式,其他不推荐方式就不展示了,下面就直接上代码:
实现方式1:饿汉式(静态常量)
public class SingleCase1 {
public static void main(String[] args) {
Single instance = Single.getInstance();
Single instance2 = Single.getInstance();
System.out.println(instance == instance2);
}
}
class Single{
private Single(){}
private static final Single instance = new Single();
public static Single getInstance(){
return instance;
}
}
实现方式2:双重检查(推荐使用)
注意:推荐使用这种方式,既能解决线程问题,也能提高效率。
实现方式3:静态内部类(推荐使用)
特点:1、类在加载的时候静态内部类是不进行装载的
2、在调用实例方法时,才会进行装载,内部类在装载的时候线程是安全的
优缺点:
- 这种方式采用了类装载的机制来保证初始化实例时只有一个线程。
- 静态内部类方式在Singelton类被装载时并不会立即实例化,而是在需要实例化时,调用getInstance方法,才会装载SingeltonInstance类,从而完成Singelton的实例化。
- 类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM帮我们保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。
- 优点:避免了线程不安全,利用静态内部类特点实现延迟加载,效率高
- 结论:推荐使用这种方式。
实现方式4:枚举(推荐使用)
优缺点:
- 枚举借助JDK1.5中添加的枚举来实现单例模式。
- 不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。
- 这种方式是Effective Java 作者Josh Bloch提倡的方式。
- 结论:推荐使用