设计模式分类
- 创建型模式:它的主要特点是 “将对象的创建和使用分离”。包括单例、原型、工厂方法、抽象工厂和建造者 5 种模式。
- 结构型模式:通过类和接口间的继承和引用实现创建复杂结构的对象。包括代理、适配器、桥接、装饰、外观、享元和组合 7 种模式。
- 行为型模式:通过类之间不同通信方式实现不同行为。包括模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录和解释器 11 种模式。
单例模式
什么是单例
保证一个类只有一个实例。要求构造方法必须是私有的,由自己创建一个静态变量存储实例,对外提供一个静态公有方法获取该实例。
优点是内存中只有一个实例,减少了开销。缺点是没有抽象层,难以扩展。
使用场景:数据库连接池、线程池
单例创建方式
1. 饿汉式
在类加载时就创建单例对象,线程安全,但不管是否使用都创建对象可能会浪费内存。
public class HungrySingleton {
private HungrySingleton(){System.out.println("私有构造函数");}
private static HungrySingleton instance = new HungrySingleton();
public static HungrySingleton getInstance() {return instance;}
public static void main(String[] args) {
HungrySingleton instance = HungrySingleton.getInstance();
}
}
2. 懒汉式
在外部调用时才创建单例对象,线程不安全。
public class LazySingleton {
private LazySingleton(){System.out.println("私有构造函数");}
private static LazySingleton instance;
public static LazySingleton getInstance() {
if(instance == null) {
instance = new LazySingleton();
}
return instance;
}
public static void main(String[] args) {
LazySingleton instance = LazySingleton.getInstance();
}
}
3. 静态内部类
结合了懒汉式和饿汉式的优点,真正需要对象的时候才会创建,并且创建时是线程安全的。
public class StaticSingleton {
private StaticSingleton(){}
public static StaticSingleton getInstance() {
return StaticClass.instance;
}
private static class StaticClass {
private static final StaticSingleton instance = new StaticSingleton();
}
public static void main(String[] args) {
StaticSingleton instance = StaticSingleton.getInstance();
}
}
4. 双重检查锁
使用 volatile 以及多重检查来减小锁范围,提升效率。