什么是设计模式
大家熟知的GOF23种设计模式,源自《Design Patterns: Elements of Reusable Object-Oriented Software》一书,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著,四人组Gang of Four简称GOF。总结了在面向 对象语言开发过程中常见问题的解决方案。
设计模式是面向对象语言开发过程中,遇到的种种场景和问题,然后提出的思路 和解决方案,最后沉淀下来,就成了设计模式。
设计模式其实就是解决问题的思路,是前辈总结出来的有效方式方法,就是套路! 学习设计模式,就是为了站在前辈的肩膀上,能更快捷优雅的解决面向对象程序 开发设计问题。
设计模式分类
创建型
单例模式
单例模式(Singleton Pattern)是确保一个类只有一个实例,并提供一个全局访问点来访问该实例的设计模式。它是创建型模式的一种,在多种编程语言中都有实现,包括Java和C++。
单例模式涉及到一个单一的类,该类负责创建自己的对象,并确保只有单个对象被创建。这个类还提供了一种访问其唯一对象的方式,允许其他对象直接访问,而无需实例化该类的对象。
工厂模式
工厂模式(Factory Pattern)是创建型设计模式的一种,它提供了一种创建对象的接口,但由子类决定要实例化的类是哪一个。工厂模式让类的实例化推迟到子类。
在工厂模式中,我们定义一个创建对象的接口,但让子类来决定实例化哪一个类。这样,工厂方法将对象的实例化推迟到了子类,使得客户端不需要知道它们所使用的对象类的名字,只需要知道所对应的工厂即可。
工厂方法模式
工厂方法模式(Factory Method Pattern)是创建型设计模式之一,它定义了一个用于创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式让一个类的实例化延迟到其子类,从而实现了灵活的对象创建机制,而无需在客户端代码中显式指定具体要创建的对象类型。
原型模式
原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有对象来生成新对象,而不是通过实例化类来创建。这种模式基于对象的克隆机制,特别适用于需要频繁创建对象的场景,可以提高性能并减少复杂的初始化过程。
建造者模式
建造者模式(Builder Pattern)是一种创建型设计模式,它的主要目的是将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。这种模式通过将对象的各部分组件的单独构造和组装分离,从而可以构造出不同的复杂对象。
结构型
适配器模式
适配器模式(Adapter Pattern)是一种结构型设计模式,它旨在将一个类的接口转换为客户端所期待的接口,使得原本由于接口不兼容而无法在一起工作的类能够协同工作。适配器模式的核心思想是“适配”,即通过创建一个适配器类,使得两个不兼容的类能够合作。
装饰器模式
装饰器模式(Decorator Pattern)是结构型设计模式的一种,也称为包装模式(Wrapper Pattern)。其核心思想是在不改变原有对象结构的基础上,动态地给该对象增加一些额外功能。装饰器模式提供了一种比继承更灵活的扩展对象功能的方式。
代理模式
代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理或占位符,以控制对这个对象的访问。代理模式涉及到一个代理对象和一个真实对象,代理对象代表真实对象,并在客户端和目标对象之间起到中介的作用。
外观模式
外观模式(Facade Pattern),又称为门面模式,是 GoF(四人帮)提出的 23 种设计模式中的一种结构型设计模式。外观模式的主要目的是为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用。通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,从而降低子系统与客户端的耦合度。
桥接模式
桥接模式(Bridge Pattern)是一种结构型设计模式,它主要用于将抽象部分与它的实现部分分离,使它们都可以独立地变化。桥接模式的核心思想是将抽象与实现解耦,通过组合的方式而不是继承来实现,从而增加系统的灵活性和可扩展性。
组合模式
组合模式(Composite Pattern),又叫部分整体模式,是一种结构型设计模式。它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系。组合模式的核心思想是让用户对单个对象和组合对象的访问具有一致性,即组合模式能让客户以一致的方式处理个别对象以及组合对象。
享元模式
享元模式(Flyweight Pattern)是一种结构型设计模式,它主要用于减少创建对象的数量,以节省内存和提高性能。享元模式通过共享相同的对象,使得在系统中只有一份实例被多个客户端使用,从而实现对象的复用。
行为型
策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式的核心思想是将算法的实现与算法的使用分离,使得算法可以独立于使用它的客户而变化。
模板方法模式
模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个算法的框架,并将某些步骤延迟到子类中实现,以便子类可以重新定义算法的某些步骤而不改变算法的结构。
观察者模式
观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,使得当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。这种设计模式主要用于实现发布-订阅机制。
迭代子模式
迭代子模式(Iterator Pattern),也称为迭代器模式,是一种行为型设计模式。它提供了一种顺序访问聚合对象中的元素而不必暴露其内部表象的方法。
责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,旨在将多个处理对象通过链式结构连接起来,以形成一条处理请求的链条。每个处理对象都有机会处理请求,或者将请求传递给链中的下一个对象。这样,客户端不需要知道哪个具体的对象会处理请求,而是通过责任链的结构来自动地传递和处理请求。
命令模式
命令模式(Command Pattern)是一种行为型设计模式,它将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化、对请求排队或记录请求日志,以及支持可撤销的操作。命令模式的主要作用是将请求发送者和接收者解耦,使得发送者无需知道接收者的具体实现,从而增加系统的灵活性和可扩展性。
备忘录模式
备忘录模式(Memento Pattern)是一种行为型设计模式,主要用于在不破坏封装性的前提下,捕获并保存一个对象的内部状态,以便将来可以恢复到该状态。备忘录模式提供了一种保存和恢复对象状态的机制,常用于需要实现撤销操作、保存历史状态或恢复先前状态的场景。
状态模式
状态模式(State Pattern)是一种对象行为型模式,它允许一个对象在其内部状态发生改变时改变它的行为,看起来像是修改了其类。状态模式将对象的行为封装在不同的状态对象中,每个状态对象都定义了对象在该状态下的行为。当对象的状态改变时,它的行为也会随之改变。
访问者模式
访问者模式(Visitor Pattern)是一种行为型设计模式,它允许你将数据结构与作用于结构上的操作解耦,使得可以在不修改数据结构的情况下添加新的操作或访问方式。访问者模式通过定义不同的访问者实现对数据的不同操作,从而在不改变数据结构的前提下动态地添加作用于这些元素上的操作。
中介者模式
中介者模式(Mediator Pattern)是一种行为型设计模式,它定义了一个中介对象来封装一系列对象之间的交互,使得对象之间不直接相互引用和通信,而是通过中介者来进行间接通信。中介者模式的主要目的是降低系统中对象之间的耦合度,提高系统的灵活性和可维护性。
解释器模式
解释器模式(Interpreter Pattern)是一种行为设计模式,主要用于处理特定语言的句法分析和解释。它定义了一种表示文法的方式,并通过解释器实现对特定语言的解释。解释器模式的核心在于将语言的文法结构表示为抽象语法树(AST),并定义解释器来遍历这棵语法树并执行相应的操作。
设计模式分类
- 1 创建型设计模式:关注对象的创建,new的花样就有很多
- 2 结构型设计模式:关注类与类之间的关系,关系有很多种, “组合优于继承”
- 3 行为型设计模式:关注对象和行为的关系(类和方法),就是方法到底该放到哪里
三大工厂
简单工厂模式(SimpleFactoryPattern): 是通过专门定义一个类来负责创建其他类的实例, 被创建的实例通常都具有共同的父类。
工厂方法模式(FactoryMethodPattern) 通过定义工厂父类负责定义创建对象的公共接口, 而子类则负责生成具体的对象。 每一个不同的的对象分别自定义个工厂+抽象;
抽象工厂模式(AbstractFactoryPattern) 在抽象工厂模式中,接口是负责创建一个相关对象的工厂。 每个生成的工厂都能按照工厂模式提供对象。 工厂+约束!
创建对象的几种方式
- 1 直接new一下
- 2 单例一下
- 3 原型一下
- 4 三大工厂—就是转移对象的创建
- 5 建造者—更复杂的工厂方法
说到底,都是在折腾怎么New一个对象!这也是创建型设计模式的核心了!
设计模式总结
创建型:花样new---关注对象的创建。
结构型:包一层------关注类与类之间的关系,组合优于继承,A里面有个B,调用 A完成调用B,所以就是包一层。
行为型:甩锅--------关注的是对象和行为的分离,对象和方法的问题,方法到底 放在哪里,把不稳定的东西丢给别人管理,所以就是甩锅 看懂需求,抓住矛盾,找到套路,实现了再看是啥模式 。
看懂需求,抓住矛盾,找到套路,实现了再看是啥模式。
设计模式终极建议
- 1 设计模式不是单一使用,而是融合,要扬长避短
- 2 设计模式就那么几个核心套路,解决问题时请不要拘泥于招数,直接上套路 解决就完了,然后你再看看是属于什么模式的
- 3 不推荐过度设计,但是写代码后,再多想一下,找找代码坏的味道解决它, 对成长很重要
设计模式的欠缺
结构型-行为型-大部分创建型 都是靠抽象来完成扩展性
因为类是静态的,写好就固定了,想扩展?
只能靠抽象-细节的替换 OOP想扩展,基本都靠抽象---OOP的困境
AOP面向切面编程---可以在不破坏封装的前提下,去扩展通用功能