温馨提示:本文作为所有 Java 设计模式文章的总体索引。
您可以通过点击每个具体的设计模式名称,连接到各自设计模式详情文章中去。
1. 什么是设计模式?
设计模式是为解决软件设计中通用问题而被提出的一套指导性思想。它是一种被反复验证、经过实践证明并被广泛应用的代码设计经验和思想总结,可以帮助开发者通过一定的模式来快速地开发高质量、可维护性强的软件。
设计模式描述了在软件开发过程中不断重复出现的问题及其解决方案,旨在提高软件系统的可维护性、可扩展性、可重用性和灵活性。设计模式不仅关注代码的可靠性、可读性和可重用性,还强调代码的易理解性,帮助开发者通过特定的模式快速开发高质量、高可维护性的软件。
设计模式在软件开发人员中非常流行。设计模式是针对常见软件问题的描述良好的解决方案。
2. 设计模式的优点
Java设计模式的优点主要体现在提高系统的非功能性设计,即增强代码的重用性、可维护性、可扩展性和可测试性。设计模式还可以提高程序员的思维能力、编程能力和设计能力,使程序设计更加标准化、代码编制更加工程化,从而缩短软件的开发周期。设计模式的应用还可以提高程序的可靠性,通过遵循一些基本的设计原则,如单一职责原则、开放封闭原则等,来减少代码中的错误和异常。
2.1 提高代码的重用性
设计模式提供了一种在软件设计中解决特定问题的通用解决方案。通过使用设计模式,开发人员可以将一些常用的代码片段封装成独立的模块,这些模块可以在不同的项目中被重复使用,避免了重复编码和硬编码的问题。
2.2 提高代码的可维护性和可读性
设计模式强调将代码按照一定的规范和结构组织起来,使得代码更加清晰且易于理解。这样,当需要对代码进行修改时,可以更加方便地定位和修改相关的代码,减少了出错的可能性。
设计模式提供了一种标准的编码方式,使得其他开发者更容易理解和维护代码。
2.3 提高代码的可扩展性和灵活性
通过使用设计模式,可以将系统的不同功能模块解耦,使得系统的各个组件之间的依赖关系更加松散。这样,在系统需要进行扩展或修改时,可以更加容易地对特定模块进行调整而无需影响其他模块的功能,以便更灵活的适应未来的变化。
2.4 提高代码的可测试性
设计模式鼓励将代码按照面向接口编程的思想进行设计,使得代码的各个模块可以独立测试。这样,在进行单元测试和集成测试时,可以更加方便地对系统进行测试和调试。
2.5 提高代码质量
通过使用经过验证的设计模式,可以减少代码中的错误,提高代码的可靠性和稳定性。
2.6 提高开发效率
使用设计模式可以避免重复造轮子,节省开发时间,加快软件开发周期。
3 设计模式分类
如上图所示:Java 设计模式分为三大类,即创建型、结构型和行为型设计模式。
3.1 创建型模式(共5种)
创建型设计模式是处理对象创建的设计模式,旨在根据实际情况使用合适的方式创建对象
,通过控制对象的创建来解决设计上的问题。它由两个主导思想构成:一是将系统使用的具体类封装起来,二是隐藏这些具体类的实例创建和结合的方式。
创建型模式分为对象创建型模式
和类创建型模式
,前者处理对象的创建,后者处理类的创建。这些设计模式在对象创建的类型、主体、方式、时间等方面提高了系统的灵活性,旨在将系统与其对象创建、结合、表示
的方式分离
,从而提高系统的可扩展性和灵活性
。
这些模式的主要目的是减少对象的创建数量
,减少开发时间
,减少代码的复杂度
,提高软件质量
和可维护性
。它们可以用于解耦,并减少程序的复杂性,为程序员提供创建对象的灵活
创建型模式包括但不限于:
3.1.1 单例模式(Singleton)
确保一个类只有一个实例,并提供一个全局访问点。
3.1.2 原型模式(Prototype)
通过复制现有对象来创建新对象,而不是通过传统的构造函数来创建新对象。
3.1.3 工厂模式(Factory Method)
工程模式也被称为“简单工厂模式”或“工厂方法模式”,通过一个共同的接口来指向新创建的对象,而不是通过直接使用具体的类来创建对象。
3.1.4 抽象工厂模式(Abstract Factory)
提供一个接口,可以创建一系列相关或相互依赖的对象。
3.1.5 建造者模式(Builder)
通过一系列步骤来构建复杂对象,允许在不改变现有代码的情况下更改程序的行为。
3.2 结构型模式(共7种)
结构型设计模式关注如何组合类和对象
以构建更大的结构。这种设计模式主要涉及对象之间的组合和交互
,而不是类的继承。结构型设计模式可以分为类结构型模式
和对象结构型模式
。
类结构型模式主要通过继承机制
来组织接口和类,而对象结构型模式则通过组合或聚合
来组合对象,以满足“合成复用原则”,提供更大的灵活性。对象结构型模式比类结构型模式具有更高的灵活性,因为组合关系或聚合关系的耦合度低于继承关系。
这些模式可以结合使用,例如在适配器模式和代理模式之间进行选择,以便在需要时动态地添加或删除代理,或者在装饰器模式和外观模式之间进行选择,以便在不需要的情况下隐藏一些复杂性。
结构型设计模式的目的是为了重用代码
、让代码更容易被他人理解、保证代码可靠性
,并且通过这种方式提高软件的灵活性
和可维护性
。
结构型设计模式包括以下几种类型:
3.2.1 适配器模式(Adapter)
用于将一个类的接口转换为客户端期望的另一个接口,解决接口不兼容的问题。
3.2.2 桥接模式(Bridge)
也称为“桥梁模式”将抽象部分与实现部分分离,使它们可以独立变化。
3.2.3 组合模式(Composite)
也被称为“复合模式”,将对象组合成树形结构,表示“整体-部分”的层次结构。
3.2.4 装饰器模式(Decorator)
在不改变对象接口的前提下,动态地为对象添加额外的职责。
3.2.5 外观模式(Facade)
为复杂的子系统提供一个简单的接口。
3.2.6 享元模式(Flyweight)
通过共享大量的细粒度对象来减少内存使用和对象创建的开销。
3.2.7 代理模式(Proxy)
为其他对象提供一种代理,以控制对这个对象的访问。
3.3 行为型模式(共11种)
行为型设计模式主要解决的是“类或对象之间的交互
”问题,通过将不同行为的代码进行解耦
,以解决特定场景问题的一些经典结构。这些模式关注对象之间的通信和协作,描述了程序在运行时复杂的流程控制,即多个类或对象之间如何相互协作共同完成单个对象无法单独完成的任务。行为型设计模式分为类行为模式
和对象行为模式
,前者通过继承机制在类间分配行为,后者通过组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则
”,因此对象行为模式比类行为模式具有更大的灵活性。
具体来说,行为型设计模式包括但不限于以下几种:
3.3.1 模板方法模式(Template Method)
定义了一个算法的骨架,将某些步骤延迟到子类中实现。这样,子类可以不改变算法结构的同时,重新定义这些步骤。
3.3.2 观察者模式(Observer)
定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
3.3.3 策略模式(Strategy)
定义一系列的算法,将每一个算法封装起来,并且使它们可以相互替换。
3.3.4 责任链模式(Chain of Responsibility)
为请求创建了一个接收者对象的链。这种模式通常用于处理复杂的请求处理流程,确保请求被适当的处理器处理。
3.3.5 状态模式(State)
允许一个对象在其内部状态改变时改变它的行为。
3.3.6 迭代器模式(Iterator)
提供一种方法顺序访问一个聚合对象中的各个元素,而无需暴露该对象的内部表示。
3.3.7 访问者模式(Visitor)
将数据操作与其结构组织分离,使得两者可以独立变化。
3.3.8 备忘录模式(Memento)
在不破坏封装性的前提下,捕获并保存一个对象的内部状态,以便以后恢复它。
3.3.9 命令模式(Command)
将一个请求封装为一个对象,从而可用不同的方式发送这个请求。请求的发送者和接收者解耦。
3.3.10 解释器模式(Interpreter)
提供一种方法来解释一种特定的语境下的语言。
3.3.11 中介者模式(Mediator)
用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用并通信。
4. 总结
以上就是有关Java 23种设计模式的详细介绍,如果想看某个具体的设计模式详细,请点击设计模式名字
,即可跳转到对应文章连接
中去!