设计模式 一共23种分为3大类:
- 创建型设计模式,共 5 种:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
- 结构型设计模式,共 7 种:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
- 行为型设计模式,共 11 种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
创建型设计模式
一、单例模式:
懒汉式:真正用到的时候才会创建这个单例对象
饿汉式:不管你用不用的上,一开始就创建这个单例对象
单例模式有俩种实现方法:
1.懒汉式(线程不安全,加锁就安全了)
加锁 :在getInstance() 上面加synchronized 但是加锁会影响效率
不加锁:这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized,所以严格意义上它并不算单例模式。
这种方式 lazy loading 很明显,不要求线程安全,在多线程不能正常工作
2.饿汉式(线程安全)
没有加锁执行效率高,但是会产生垃圾对象,不能延迟加载
3.双检锁/双重校验锁(懒加载初始化)(DCL,即 double-checked locking)(这种方式采用双锁机制,安全且在多线程情况下能保持高性能)
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
由于JVM底层内部模型原因,偶尔会出问题,不建议使用
4.登记式/静态内部类(懒加载初始化,线程安全,可以延迟加载,调用率高)
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
5.枚举(不是懒加载初始化,线程安全)
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
——单例对象 占用资源少,不需要 延时加载
枚举式 好于 饿汉式
——单例对象 占用资源大,需要延时加载
静态内部类式 好于 懒汉式
二、工厂模式:在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
例如:
1.一个接口有一个方法,这个接口有三种不同的实现类。
2.一个工厂类 根据传进去的值判断走哪个实现类 方法返回类型为接口类类型。
二、抽象工厂模式:在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
例如:不止有一个接口俩个接口 放在一个抽象类里
三、创建者模式又叫建造者模式
四、原型模式
结构型设计模式
一、代理模式: