Java 设计模式 – 示例教程

引言

设计模式在软件开发者中非常流行。设计模式是对常见软件问题的精确解决方案的描述。

使用设计模式的一些好处有:

    1. 设计模式已经被定义并提供了解决一种经常出现的问题的行业标准方法,因此如果我们合理地使用设计模式,可以节省时间。在我们基于Java的项目中,有许多Java设计模式可以使用。

 

    1. 使用设计模式促进了代码的可重用性,从而使代码更加稳健和易于维护。它有助于降低软件产品的总拥有成本(TCO)。

 

    由于设计模式已经被定义,这使得我们的代码易于理解和调试。它加快了开发速度,新团队成员也容易理解。

Java的设计模式分为三类——创建型、结构型和行为型设计模式。

本文为所有Java设计模式文章提供索引。

创建型设计模式

创造性设计模式提供了适用于特定情况下最佳实例化对象的解决方案。

单例模式

单例模式限制了类的实例化,并确保在Java虚拟机中只存在一个类的实例。单例模式的实现一直是开发人员中备受争议的话题。

Note

注意:了解更多关于单例设计模式的内容。

2. 工厂模式

当我们有一个具有多个子类的超类,并且根据输入,需要返回其中一个子类时,我们使用工厂设计模式。该模式将实例化类的责任从客户程序转移到工厂类。我们可以在工厂类上应用单例模式,也可以将工厂方法设为静态。

Note

注意:了解更多关于工厂模式的内容。

3. 抽象工厂模式

The third pattern that we will discuss is the abstract factory pattern.

抽象工厂模式类似于工厂模式,它是一种工厂的工厂。如果您熟悉Java中的工厂设计模式,您会注意到我们有一个单个的工厂类,根据提供的输入返回不同的子类,并且工厂类使用if-else或switch语句来实现这一点。在抽象工厂模式中,我们摒弃了if-else的写法,并为每个子类都有一个工厂类,然后有一个抽象工厂类,根据输入的工厂类返回相应的子类。

Note

注意:了解更多关于抽象工厂模式的信息。

4. 建造者模式

建造者模式是为了解决工厂模式和抽象工厂模式中对象包含大量属性时的一些问题而引入的。通过逐步构建对象并提供一个最终返回该对象的方法,该模式解决了大量可选参数和不一致状态的问题。

Note

注意:了解更多有关建造者模式的信息。

5. 原型模式

原型模式适用于对象创建耗费高昂、需要大量时间和资源的情况下,且您已经存在一个相似的对象。因此,该模式提供了一种机制,可以将原始对象复制到一个新的对象,然后根据我们的需求进行修改。该模式使用Java的克隆机制来复制对象。原型设计模式规定了要复制的对象必须具备复制特性,而不能由其他类来实现。然而,是使用浅拷贝还是深拷贝取决于需求,并且是一个设计决策。

Note

注意:了解有关原型模式的更多信息。

结构性设计模式

结构性设计模式提供了创建类结构的不同方法,例如使用继承和组合来从小对象创建一个大对象。

1. 适配器模式

适配器设计模式是结构性设计模式之一,用于使两个不相关的接口能够合作。将这些不相关的接口连接起来的对象称为适配器。

Note

注意:了解有关适配器模式的更多信息。

2. 组合模式

当我们需要表示一个部分-整体层次结构时,可以使用组合模式。当我们需要以一种方式创建结构,让结构中的对象以相同方式被处理时,我们可以应用组合设计模式。

Note

注意:了解更多关于组合模式的信息。

3. 代理模式

代理模式为另一个对象提供了一个占位符来控制对它的访问。当我们希望提供受控访问功能时,使用该模式。

Note

注意:了解更多关于代理模式的知识。

4. 享元模式

当我们需要创建大量类的对象时,可以使用享元设计模式。由于每个对象占用存储空间,对于低内存设备(例如移动设备或嵌入式系统)来说这是很关键的。因此,我们可以应用享元设计模式来分享对象,从而减轻对内存的负荷。

在Java中,字符串池的实现是享元模式实现的最佳示例之一。

Note

注意:了解更多关于享元模式的信息。

5. 外观模式

外观模式被用来帮助客户端应用程序与系统轻松交互。

Note

注意:了解更多有关外观模式的信息。

6. 桥接模式

当我们在接口和实现中都拥有接口层次结构时,桥接设计模式用于将接口与实现解耦,并将实现细节隐藏起来,不让客户程序知晓。桥接设计模式的实现遵循组合优于继承的理念。

Note

注意:了解更多关于桥接模式的内容。

7. 装饰器模式

装饰器设计模式用于在运行时修改对象的功能。同时,同一类的其他实例不会受到影响,因此个别对象获得了修改后的行为。装饰器设计模式是结构性设计模式之一(例如适配器模式、桥接模式或组合模式),它使用抽象类或接口与组合来实现。我们通过继承或组合来扩展对象的行为,但这是在编译时完成的,并且适用于类的所有实例。我们不能在运行时添加任何新功能或删除任何现有行为,而这正是装饰器模式有用的地方。

Note

注意:了解更多关于装饰器模式的内容。

行为设计模式

行为模式提供了一种更好的对象互动的解决方案,以及如何提供松散耦合和灵活性以便轻松扩展。

1. 模板方法模式 (Mó

模板方法模式是一种行为设计模式,用于创建方法存根并将某些实现步骤推迟给子类。模板方法定义了执行算法的步骤,并且可以提供一个默认实现,该实现可能适用于所有或部分子类。

Note

注意:了解更多关于模板方法模式的内容。

2. 中介模式

中介者设计模式用于在系统中不同对象之间提供一个集中的通信媒介。如果对象直接相互交互,系统组件之间会紧密耦合,导致维护成本增加且不易于灵活扩展。中介者模式专注于为对象之间提供中介者来进行通信,并实现对象之间的松耦合。中介者作为对象之间的路由器工作,并且可以拥有自己的逻辑来提供一种通信方式。

Note

注意:了解有关中介者模式的更多信息。

3. 责任链模式

责任链模式用于实现软件设计中的松耦合,其中客户端的请求会传递给一个对象链来处理。然后链中的对象将决定谁来处理该请求,以及是否需要将请求发送给链中的下一个对象。

我们知道,在try-catch代码块中可以有多个catch块。这里的每个catch块都是一种处理特定异常的处理器。当在try块中发生异常时,它会被发送到第一个catch块进行处理。如果catch块无法处理异常,它将将请求转发给链中的下一个对象(即下一个catch块)。如果甚至最后一个catch块也无法处理异常,则异常将被抛出到调用程序之外的链中。

Note

注意:了解有关责任链模式的更多信息。

4. 观察者模式

当您对对象的状态感兴趣并希望在任何变化时得到通知时,观察者设计模式非常有用。在观察者模式中,观察另一对象状态的对象被称为观察者,而被观察的对象被称为主题。

Java提供了一个内置平台,通过java.util.Observable类和java.util.Observer接口来实现观察者模式。然而,由于实现受限且大部分时间我们不想仅仅为了实现观察者模式而扩展一个类,所以它并不被广泛使用,因为Java的类不能具备多重继承。Java消息服务(Java Message Service,JMS)使用观察者模式和中介者模式,允许应用程序订阅并发布数据给其他应用程序。

Note

注意:了解更多关于观察者模式的内容。

5. 策略模式

当我们在特定任务中有多个算法,并且客户端决定在运行时使用实际的实现时,使用策略模式。策略模式也被称为策略模式。我们定义多个算法,并允许客户端应用程序将要使用的算法作为参数传递。

这个模式的最好例子之一是Collections.sort() 方法,它接受一个Comparator参数。根据不同的比较器接口实现,对象以不同的方式进行排序。

Note

注意:了解更多关于策略模式的信息。

命令模式

命令模式用于在请求-响应模型中实现松耦合。在这种模式中,请求被发送给调用者,调用者将其传递给封装的命令对象。命令对象将请求传递给接收者的适当方法以执行特定动作。

Note

注意:了解更多关于命令模式的内容。

7. 状态模式 (State Pattern)

当对象基于其内部状态改变行为时,使用状态设计模式。如果我们需要根据对象的状态改变其行为,我们可以在对象中设置一个状态变量,并使用if-else条件块根据状态执行不同的动作。状态模式是通过上下文和状态实现提供一种系统化且松耦合的方式来实现这一目标。

Note

注意:了解更多关于状态模式的内容。

8. 访问者模式 zhě

当我们需要在一组相似类型的对象上执行操作时,使用访问者模式。借助访问者模式,我们可以将操作逻辑从对象中移动到另一个类中。

Note

注意:了解更多有关访问者模式的信息。

9. 解释器模式

解释器模式用于定义一种语言的语法表示,并提供一个解释器来处理这种语法。

10. 迭代器模式

迭代器模式是行为模式之一,用于提供一种标准的方式来遍历一组对象。迭代器模式在Java集合框架中被广泛使用,其中迭代器接口提供了遍历集合的方法。该模式还用于根据我们的需求提供不同类型的迭代器。迭代器模式隐藏了通过集合进行遍历的实际实现,客户端程序使用迭代器方法。

Note

注意:了解更多关于迭代器模式的内容。

11. 忘忧模式

当我们想要保存一个对象的状态以便以后恢复时,会使用备忘录设计模式。该模式用于以某种方式实现这一点,即对象的保存状态数据不能从对象外部访问,这样保护了保存状态数据的完整性。

备忘录模式由两个对象——发起人和管理员(caretaker)实现。发起人是需要保存和恢复状态的对象,它使用内部类来保存对象的状态。内部类被称为“备忘录”,并且它是私有的,因此其他对象无法访问。

各种各样的设计模式

以下是许多不属于四人帮设计模式的设计模式。让我们来看看这些受欢迎的设计模式。

1. 道设计模式

数据访问对象(DAO)设计模式用于将数据持久化逻辑解耦为单独的层。当我们设计与数据库交互的系统时,DAO是一个非常流行的模式。其思想是将服务层与数据访问层分开,从而实现应用程序中的逻辑分离。

Note

注意:了解更多关于DAO模式的信息。

2. 依赖注入模式 (Yī Zhù Rù

依赖注入模式允许我们消除硬编码的依赖关系,使我们的应用程序松耦合、可扩展和可维护。我们可以在Java中实现依赖注入,将依赖解析从编译时移到运行时。Spring框架建立在依赖注入的原则之上。

Note

注意:深入了解依赖注入模式。

3. MVC模式

MVC模式是创建Web应用程序的最早的架构模式之一。

结论

本文总结了Java设计模式。

你可以从我们的GitHub代码仓库中查看Java设计模式的示例代码。

继续通过更多Java教程来不断学习。

广告
将在 10 秒后关闭
bannerAds