GoF23
- 创建模式
- 工厂方法 ✅
- 抽象工厂 ✅
- 建造者
- 原型
- 单例 ✅
- 结构模式
- 类适配器
- 对象适配器
- 桥接
- 组合
- 装饰
- 外观
- 享元
- 代理
- 行为模式
- 解释器
- 模板方法
- 指责链
- 命令
- 迭代器
- 中介者
- 备忘录
- 观察者
- 状态
- 策略
- 访问者
7个设计原则
单一职责
开闭原则:
对扩展开放,对修改关闭
里氏代换:
所有引用基类的地方必须能透明地使用其子类的对象
依赖倒转:
抽象不应该依赖于细节,细节应该依赖于抽象
接口隔离
合成复用
迪米特法则
==开闭原则是目标,里氏代换是基础,依赖倒转是手段。它们相辅相成,目标一致,只是分析问题时所站的角度不同而已。==
我的理解:开闭原则是我们要做什么,里氏代换是为什么能这么做,依赖倒转是要怎么做
创建模式
单例模式
确保一个类只有一个对象
- 通过私有化构造器保证用户无法在外部直接实例化
- 提供一个静态方法来暴露这个唯一实例
饿汉式
1 | public class Singleton { |
懒汉式
使用双重检查锁定来保证多线程下的单例
1 | public class LazySingleton { |
简单工厂模式
定义一个工厂类,根据不同参数返回不同的实例,这些实例通常有相同父类
最简单的设计模式之一
1 | public class SimpleFactory { |
缺点: 每增加一种产品就要修改工厂类的代码,不满足开闭原则
工厂方法模式
工厂类和产品类都是抽象的,由具体工厂决定具体产品
1 | // 抽象产品 |
优点:满足开闭原则
缺点:每引入一个新的具体产品,具体工厂类和具体产品类会成对增加,增加了系统复杂度
抽象工厂模式
工厂方法模式的演进,一个工厂创建一系列产品
1 | // 抽象工厂 |
此模式下开闭原则的倾斜性:对于增加新的产品族很容易,无需修改代码;但对于增加新的产品等级结构时需要修改代码
原型模式
结构模式
适配器模式
外观模式
代理模式
行为模式
策略模式
定义一系列算法,将每个算法单独封装起来,并让它们可以相互替换
其实就是一个接口的多种实现类。我的评价是:八十岁奶奶都会
1 | // 折扣接口,充当抽象策略类 |
模板方法模式
定义一个操作算法的框架,而将其中一些步骤延迟到子类中
结构最简单的行为型设计模式,只存在父子间的继承关系。本质上就是基于继承的代码复用
- 模板方法:将基本方法组合在一起形成一个总算法
- 基本方法:
- 抽象方法:由抽象类声明,必须由实现类实现
- 具体方法:由抽象类声明并实现,子类可以直接继承或自己覆盖
- 钩子方法:由抽象类声明,通常由父类给出一个空实现或默认实现,子类可以直接继承或自己覆盖。意义在于子类可以通过钩子方法改变模板方法的流程(这类钩子方法的返回值通常是boolean),即使子类不覆盖也可以编译通过
1 | // 账户类,充当抽象类 |