gof设计模式共23种:分为3类
创建型:1、工厂方法模式2、抽象工厂模式3、单例模式4、建造者模式5、原型模式
其中单例和原型模式很好理解,也很常用,主要是单例的6种实现方法要清楚,且各针对哪些场景:饿汉式适合大部分场景,但没有懒加载,如果明确要求懒加载考虑内部类或双检锁方式,如涉及反序列化使用枚举方式,单线程下使用线程不安全的懒汉式,线程安全的懒汉式性能太低,不推荐使用。
工厂系列:先说简单工厂(静态工厂),不符合开闭原则,不属于GoF23种设计模式,如果产品数量固定,不需要增加可以选择该模式,实现简单。然后工厂方法和抽象工厂都是为了解决接口选择的问题,但是工厂方法是针对一种产品,而抽象工厂是针对一系列相互依赖或相关产品的创建。其中简单工厂可以利用反射消除switch分支,各工厂模式配合使用可能会有很好的效果。
建造者模式用于要构建复杂对象时,如果一个对象需要很多组件才能使用,且组件会经常发生变化,但是组成部分必须相同,外界使用时又不想知道具体构建过程,就可以使用该模式。
创建型模式都比较常用
结构型:1、适配器模式2、装饰器模式3、代理模式4、外观模式5、桥接模式6、组合模式7、享元模式
适配器模式应用于想要用既有接口,但是接口不符合当前要求的场景。
装饰器是给已有接口添加额外功能。
代理模式应用于对一个代理对象访问的控制场景。
外观模式将各个子系统的调用封装,对外提供一个简化的统一接口。
桥接模式用于一个类有多种角度的变化,利用聚合代替继承使抽象和实现分类。
组合模式适用于具有整体-部分的场景,为组合对象和单个对象提供一致的接口
享元模式用于系统需要大量类似的对象,但是要分离好内部和外部状态,内部变化要小,外部变化大
其中常用的有适配器模式、装饰器模式、代理模式、组合模式
行为型:1、策略模式2、命令模式3、状态模式4、观察者模式5、访问者模式6、中介者模式7、迭代器模式8、解释器模式9、模板方法模式10、责任链模式11、备忘录模式
策略模式为了封装一系列的算法并使它们可以相互替换。
命令模式在需要对命令进行记录、撤销或重做、事务等处理时可以考虑使用。(任何认为是命令的场景都可以用,但是如果没有上面几种需求,就多余了)。
状态模式适应于对象行为随状态改变的场景。
观察者模式:一个对象变化要通知其他一些对象的时候使用。
访问者模式:需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些封装到类中。(简单来说就是一个类要增加一堆跟自己没啥关系的方法,就可以这些方法提出来假装成要访问这个类的另一个对象,也就是访问者,其实就是抽象的过程实现解耦)
中介者模式用于一系列对象之间需要通信,但是又不想直接通信的场景
迭代器模式提供一个集合的遍历的统一接口,几乎用不到,因为jdk已经有了
解释器模式提供一个解释特定语句的接口。用的不多
模板方法模式提供一个算法执行的骨架,主要为了封装不变的部分,扩展可变部分。做什么事有一定稳定步骤但是具体每个步骤的实现可能不同的场景。
责任链模式,一个请求需要一系列对象去处理,或者直到找到人去处理的场景。
备忘录模式,应用于一个对象状态需要恢复的场景
常用的有:策略模式、命令模式、观察者模式、模板方法模式、备忘录模式