思维导图(详见博文资源)
学习资源
https://www.runoob.com/design-pattern/proxy-pattern.html
https://refactoringguru.cn/design-patterns/factory-method
GoF
1、单例模式(Singleton)
重要思想:构造器私有 (别人无法new这个对象)保证只有单个对象被创建
1、饿汉式:不管三七二十一,上来先把对象加载出来
多线程安全
缺点::类加载时就初始化,浪费内存(拿数组来说,有的数组new出来后以后可能并没用到)
public class Hungry {
private Hungry() {
}
private static final Hungry HUNGRY = new Hungry();
public static Hungry getInstance() {
return HUNGRY;
}
}
2、懒汉式:
①线程不安全
public class LazyMan {
private LazyMan() {
}
private static LazyMan lazyMan;
public static LazyMan getInstance() {
if (lazyMan == null) {
lazyMan = new LazyMan();
}
return lazyMan;
}
}
②线程安全: DCL(double-checked locking)懒汉式
volatile:原子性操作 -> 避免指令重排
静态内部类
多线程安全
public class Holder {
private Holder() {
}
public static Holder getInstance() {
return InnerClass.HOLDER;
}
public static class InnerClass {
private static final Holder HOLDER = new Holder();
}
}
单例不安全:反射可破坏单例
2、观察者模式
适合应用场景:
- 当一个对象状态的改变需要改变其他对象, 或实际对象是事先未知的或动态变化的时, 可使用观察者模式。
- 当你使用图形用户界面类时通常会遇到一个问题。 比如, 你创建了自定义按钮类并允许客户端在
按钮
中注入自定义代码, 这样当用户按下按钮时就会触发这些代码。 - 当应用中的一些对象必须观察其他对象时, 可使用该模式。 但仅能在有限时间内或特定情况下使用。
- 订阅列表是动态的, 因此订阅者可随时加入或离开该列表。
3、工厂模式(Factory)
简单工厂模式 :对于增加新的产品,需要扩展已有代码
优点:方便调用者使用对象
缺点:没有满足开闭原则 -> 虽然某种程度不符合设计原则,但实际使用最多
工厂方法模式:不修改已有类的前提下,通过增加新的工厂类实现扩展
二者对比
4、抽象工厂模式
- 围绕一个超级工厂创建其他工厂,该工厂又称为其他工厂的工厂
- 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
- 不可以增加产品,可以增加产品族
UML类图
举例
5、代理模式
应用实例:Spring AOP