Java设计模式是经过反复验证的、解决特定问题的可重用解决方案。
设计模式对特定问题的抽象描述,提供了一种在不同情境下可重复使用的解决方法。
一、设计模式通常分类
创建型模式:关注对象的创建方式。
结构型模式:关注如何组合类和对象以实现更大的功能。
行为型模式:关注对象之间的交互以及职责的分配。
二、创建型模式
创建型模式主要关注对象的创建,目的是通过不同的方式来实例化对象,增强系统的灵活性和可扩展性。
1.单例模式(Singleton Pattern)
确保一个类只有一个实例,并提供一个全局访问点。
用于需要全局唯一实例的情况,如配置管理、线程池等。
实现方式:
饿汉式:在类加载时就创建实例,线程安全。
懒汉式:在需要实例时创建,线程不安全。
双重检查锁定:线程安全,性能较优。
2.工厂方法模式(Factory Method Pattern)
定义一个用于创建对象的接口,但由子类决定实例化哪一个类。
工厂方法将对象的创建过程延迟到子类。
3.抽象工厂模式(Abstract Factory Pattern)
提供一个创建一系列相关或依赖对象的接口,而无需指定具体类。
4.建造者模式(Builder Pattern)
使用多个简单的对象一步步构建一个复杂的对象。
将构建与表示分离,使得同样的构建过程可以创建不同的表示。
5.原型模式(Prototype Pattern)
通过复制现有的对象来创建新的对象。
适用于对象的创建成本较大,或者需要多次重复创建相似对象的场景。
三、结构型模式
关注如何将类或对象组合成更大的结构。目标是通过简化系统的结构,增强其灵活性和可扩展性。
1.适配器模式(Adapter Pattern)
通过将一个类的接口转换成客户端期望的另一种接口,使得原本因接口不兼容而无法一起工作的类能够一起工作。
用于系统中不兼容的接口之间的转换。
2.桥接模式(Bridge Pattern)
将抽象部分与实现部分分离,使得两者可以独立地变化。
用于抽象部分与实现部分之间的解耦。
3.组合模式(Composite Pattern)
将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
用于需要处理树形结构的情况,如文件系统。
4.装饰器模式(Decorator Pattern)
在不改变对象代码的情况下动态地给一个对象添加额外的职责。
用于对对象的功能进行扩展。
5.外观模式(Facade Pattern)
为复杂的子系统提供一个简化的接口,隐藏了子系统的复杂性。
6.享元模式(Flyweight Pattern)
享元模式通过共享相同的对象来避免重复创建。
用于减少创建对象的数量,从而节省内存。
7. 代理模式(Proxy Pattern)
代理模式为其他对象提供一种代理以控制对该对象的访问。
通常用于懒加载、访问控制、日志记录等场景。
四、行为模式
关注对象之间的通信、职责分配以及如何有效地处理对象之间的交互。行为型模式的目标是使得对象之间的交互更加灵活,减少耦合,并提高系统的可扩展性和可维护性。
1.责任链模式(Chain of Responsibility Pattern)
通过将请求沿着链传递,直到有一个对象处理该请求为止。每个处理对象决定是否处理请求,或者将请求传递给链中的下一个对象。
关键点:
请求传递链
每个处理者对象决定是否处理请求
示例:
审批流程,多个审批人按顺序审批,直到某个审批人同意。
2.命令模式(Command Pattern)
将请求封装成一个对象,从而使得客户可以使用不同的请求、队列或者日志请求。请求和执行解耦,允许请求撤销、重做等操作。
关键点:
将请求封装为命令对象
通过执行命令来解耦请求的发起者和处理者
示例:
远程控制开关,点击按钮触发命令。
3.解释器模式(Interpreter Pattern)
为语言的语法定义一个解释器,该解释器能够根据文法规则来解释或执行特定的语言命令。通常用于编写解释器或者编译器。
关键点:
语言的文法规则和语法树
通过递归的方式解释文法
示例:
SQL查询语句的解释执行,数学表达式求值。
4.迭代器模式(Iterator Pattern)
迭代器模式提供了一种顺序访问集合对象元素的方式,而不暴露该集合对象的内部表示。它允许顺序访问集合中的元素,同时避免直接访问集合的底层数据结构。
关键点:
提供统一的遍历接口
不暴露集合的内部结构
示例:
遍历集合中的元素,尤其是在不想暴露集合内部结构时使用。
5.中介者模式(Mediator Pattern)
通过一个中介对象来封装一组对象的交互,减少对象之间的耦合,使得对象不需要直接引用彼此,且可以通过中介者对象来协作。
关键点:
通过中介者对象协调各个对象的交互
减少类之间的依赖关系
示例:
聊天室中的用户,所有消息都通过聊天室中介者传递。
6.备忘录模式(Memento Pattern)
在不暴露对象内部状态的情况下,捕获对象的内部状态,并在需要时恢复它。常用于实现撤销操作。
关键点:
保存对象的状态
可以在之后恢复对象的状态
示例:
文本编辑器中的撤销功能,保存当前编辑状态,并在需要时恢复。
7.观察者模式(Observer Pattern)
当一个对象的状态发生变化时,所有依赖于它的对象都会自动得到通知并更新。它定义了一种一对多的依赖关系。
关键点:
一对多的关系
被观察者通知所有观察者
示例:
发布-订阅系统,用户订阅某个话题,话题更新,所有订阅者都会收到通知。
8.状态模式(State Pattern)
允许对象在内部状态改变时改变其行为。对象看起来像是改变了它的类。状态模式可以避免大量的条件语句。
关键点:
将不同的状态抽象成独立的类
状态切换影响对象的行为
示例:
电商网站的订单状态:待付款、待发货、已完成等,每个状态行为不同。
9.策略模式(Strategy Pattern)
定义一系列的算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。
关键点:
允许算法之间的切换
将算法封装成独立的类
示例:
支付方式的选择,用户可以选择不同的支付方式,如支付宝、微信支付等。
10.模板方法模式(Template Method Pattern)
定义一个操作的算法框架,允许子类实现算法的某些步骤。通过这种方式,子类可以在不改变算法结构的情况下重新定义算法中的某些步骤。
关键点:
父类定义算法框架
子类实现具体的步骤
示例:
制作饮品的过程:父类定义喝茶的流程(沏茶、加入糖等),而具体的步骤由子类决定(如使用绿茶或红茶)。
11.访问者模式(Visitor Pattern)
将操作封装在访问者类中,可以在不改变元素类的情况下,定义新的操作。通过接受访问者的方式让元素执行不同的操作。
关键点:
允许在不改变元素类的情况下增加新的操作
将操作封装为访问者对象
示例:
文件系统遍历,文件和文件夹可以接受不同的操作(如删除、压缩等)。