Java 设计模式 - 示例教程
介绍
设计模式在软件开发人员中非常流行。设计模式是针对常见软件问题的描述良好的解决方案。
使用设计模式的一些好处包括:
- 设计模式已经定义好,并提供了解决重复问题的行业标准方法,因此如果我们明智地使用设计模式,就可以节省时间。我们可以在基于 Java 的项目中采用许多 Java 设计模式。
- 使用设计模式可以提高可重用性,从而产生更强大、更易于维护的代码。它有助于降低软件产品的总拥有成本 (TCO)。
- 由于设计模式已经定义,它使我们的代码易于理解和调试。它加快了开发速度,并且团队的新成员也很容易理解。
Java 设计模式分为三类 -创建型、结构型和行为型设计模式。
本文作为所有 Java 设计模式文章的索引。
创建型设计模式
Object
创建型设计模式为特定情况提供了以最佳方式实例化的解决方案。
1.单例模式
单例模式对类的实例化进行限制Class
,保证在Java虚拟机中该类的实例只有一个,单例模式的实现一直是开发者们争论的话题。
注意:了解有关单例设计模式的更多信息。
2.工厂模式
当我们有一个具有多个子类的超类,并且需要根据输入返回其中一个子类时,可以使用工厂设计模式。此模式将实例化的责任Class
从客户端程序转移到工厂类。我们可以在工厂类上应用单例模式,也可以使用工厂方法static
。
注意:了解有关工厂设计模式的更多信息。
3.抽象工厂模式
抽象工厂模式与工厂模式类似,是工厂的工厂。如果您熟悉 Java 中的工厂设计模式,您会注意到我们有一个工厂类,它根据提供的输入返回不同的子类,并且工厂类使用if-else
或switch
语句来实现这一点。在抽象工厂模式中,我们摆脱了if-else
块,为每个子类设置一个工厂类,然后有一个抽象工厂类,它将根据输入的工厂类返回子类。
注意:了解有关抽象工厂模式的更多信息。
4.建造者模式
引入构建器模式是为了解决对象包含大量属性时工厂和抽象工厂设计模式的一些问题。此模式通过提供逐步构建对象的方法并提供一种实际返回最终结果的方法,解决了大量可选参数和状态不一致的问题Object
。
注意:了解有关Builder Pattern 的更多信息。
5.原型模式
Object
当创建成本高昂且需要大量时间和资源,并且您已经有一个类似的对象时,将使用原型模式Object
。因此,此模式提供了一种将原始对象复制Object
到新对象Object
,然后根据我们的需求进行修改的机制。此模式使用 Java 克隆来复制Object
。原型设计模式要求Object
您正在复制的对象应提供复制功能。任何其他类都不应该这样做。但是,是否使用对象属性的浅拷贝或深拷贝取决于需求,并且是一个设计决策。
注意:了解有关原型模式的更多信息。
结构设计模式
结构设计模式提供了创建Class
结构的不同方法(例如,使用继承和组合来Object
从小Object
结构创建大结构)。
1.适配器模式
适配器设计模式是结构设计模式之一,用于使两个不相关的接口可以协同工作。连接这些不相关接口的对象称为适配器。
注意:了解有关适配器模式的更多信息。
2. 复合模式
当我们需要表示部分-整体层次结构时,可以使用复合模式。当我们需要创建一个结构,并且结构中的对象必须以相同的方式处理时,我们可以应用复合设计模式。
注意:了解有关复合模式的更多信息。
3.代理模式
代理模式为其他人提供了一个占位符,Object
以控制对其的访问。当我们想要提供对功能的受控访问时,可以使用此模式。
注意:了解有关代理模式的更多信息。
4.享元模式
当我们需要创建大量的 时,可以使用享元设计模式Object
。Class
由于每个Object
都会占用内存空间,这对于低内存设备(如移动设备或嵌入式系统)来说至关重要,因此可以应用享元设计模式,通过共享 来减少内存负载Object
。
Java 中的字符串池实现是享元模式实现的最佳示例之一。
注:了解有关享元模式的更多信息。
5. 外观模式
外观模式用于帮助客户端应用程序轻松地与系统交互。
注意:了解有关Facade 模式的更多信息。
6. 桥梁模式
当接口和实现中都有接口层次结构时,桥接设计模式用于将接口与实现分离,并向客户端程序隐藏实现细节。桥接设计模式的实现遵循优先组合而非继承的理念。
注意:了解有关桥接模式的更多信息。
7.装饰者模式
装饰器设计模式用于在运行时修改对象的功能。同时,同一类的其他实例不会受此影响,因此单个对象获得修改后的行为。装饰器设计模式是结构设计模式之一(例如适配器模式、桥接模式或组合模式),使用抽象类或接口与组合来实现。我们使用继承或组合来扩展对象的行为,但这是在编译时完成的,并且适用于该类的所有实例。我们不能在运行时添加任何新功能来删除任何现有行为——这是装饰器模式有用的时候。
注意:了解有关装饰器模式的更多信息。
行为设计模式
行为模式为对象之间更好的交互以及如何提供松散耦合和灵活性以便于扩展提供了解决方案。
1.模板方法模式
模板方法模式是一种行为设计模式,用于创建方法存根并将一些实现步骤推迟到子类。模板方法定义执行算法的步骤,并且可以提供默认实现,该实现可能对所有或部分子类通用。
注意:了解有关模板方法模式的更多信息。
2.中介者模式
中介设计模式用于在系统中的不同对象之间提供集中式通信媒介。如果对象之间直接交互,系统组件彼此之间就会紧密耦合,这会使可维护性成本更高,并且不易灵活扩展。中介模式专注于在对象之间提供中介进行通信,并实现对象之间的松耦合。中介充当对象之间的路由器,它可以有自己的逻辑来提供通信方式。
注意:了解有关中介模式的更多信息
3. 责任链模式
责任链模式用于在软件设计中实现松耦合,客户端的请求被传递给对象链进行处理。然后链中的对象将决定谁将处理该请求以及是否需要将请求发送给链中的下一个对象。
我们知道,一个块代码catch
中可以有多个块。这里每个块都是一种处理器,用于处理特定异常。因此,当块中发生异常时,它会被发送到第一个块进行处理。如果该块无法处理它,它会将请求转发到链中的下一个块(即下一个块)。如果最后一个块也无法处理它,则将异常抛出链外并传递给调用程序。try-catch
catch
try
catch
catch
Object
catch
catch
注:详细了解责任链模式。
4.观察者模式
如果您对某个对象的状态感兴趣Object
,并希望在发生任何变化时收到通知,则观察者设计模式非常有用。在观察者模式中,Object
观察另一个对象状态的Object
称为观察者,而Object
被观察的 称为主体。
Java 提供了一个内置平台,可通过java.util.Observable
类和java.util.Observer
接口来实现观察者模式。但是,由于实现有限,因此它并未得到广泛使用,而且大多数情况下,我们不希望最终仅扩展一个类来实现观察者模式,因为 Java 不提供类中的多重继承。Java 消息服务 (JMS) 使用观察者模式和中介者模式来允许应用程序订阅和发布数据到其他应用程序。
注意:了解有关观察者模式的更多信息。
5.策略模式
当我们针对特定任务有多种算法时,可以使用策略模式,客户端决定在运行时使用的实际实现。策略模式也称为策略模式。我们定义多种算法,并让客户端应用程序传递要用作参数的算法。
此模式的最佳示例之一是Collections.sort()
采用Comparator参数的方法。根据比较器接口的不同实现,对象以不同的方式进行排序。
注意:了解有关策略模式的更多信息。
6. 命令模式
命令模式用于在请求-响应模型中实现松耦合。在此模式中,请求被发送给调用者,调用者将其传递给封装的命令对象。命令对象将请求传递给接收者的适当方法以执行特定操作。
注意:了解有关命令模式的更多信息。
7.状态模式
当基于内部状态改变行为时,使用状态设计模式。如果我们必须基于状态Object
改变行为,我们可以在状态中使用状态变量并使用条件块根据状态执行不同的操作。状态模式用于通过上下文和状态实现提供一种系统且松散耦合的方法来实现此目的。Object
Object
if-else
注意:了解有关状态模式的更多信息。
8. 访客模式
当我们需要对一组相似类型的对象执行操作时,可以使用访问者模式。借助访问者模式,我们可以将操作逻辑从对象转移到另一个类。
注意:了解有关访问者模式的更多信息。
9. 解释器模式
解释器模式用于定义一种语言的语法表示,并提供一个解释器来处理这种语法。
10.迭代器模式
迭代器模式是行为模式之一,用于提供遍历一组对象的标准方法。迭代器模式在Java 集合框架中被广泛使用,其中迭代器接口提供了遍历的方法Collection
。此模式还用于根据我们的需求提供不同类型的迭代器。迭代器模式隐藏了遍历的实际实现,Collection
客户端程序使用迭代器方法。
注意:了解有关迭代器模式的更多信息。
11. 纪念图案
当我们想要保存对象的状态以便稍后恢复时,可以使用备忘录设计模式。此模式用于实现这一点,即对象的已保存状态数据在对象外部不可访问Object
,从而保护已保存状态数据的完整性。
备忘录模式由两个类实现Object
——发起者 (originator )和看管者 (caretaker)。发起者是Object
需要保存和恢复其状态的类,它使用一个内部类来保存其状态Object
。这个内部类称为“备忘录”,因此private
其他对象无法访问它。
杂项设计模式
有很多设计模式不属于四人帮设计模式。让我们来看看其中一些流行的设计模式。
1. DAO 设计模式
数据访问对象 (DAO) 设计模式用于将数据持久性逻辑分离到单独的层。当我们设计使用数据库的系统时,DAO 是一种非常流行的模式。其理念是将服务层与数据访问层分开。这样我们就可以在应用程序中实现逻辑分离。
注意:了解有关DAO 模式的更多信息。
2.依赖注入模式
依赖注入模式允许我们删除硬编码的依赖项,并使我们的应用程序松散耦合、可扩展和可维护。我们可以在 Java 中实现依赖注入,将依赖项解析从编译时移到运行时。Spring 框架建立在依赖注入的原理之上。
注意:了解有关依赖注入模式的更多信息。
3. MVC 模式
模型-视图-控制器 (MVC) 模式是创建 Web 应用程序最古老的架构模式之一。
结论
本文总结了Java设计模式。
您可以从我们的GitHub 存储库查看 Java 设计模式示例代码。
通过更多Java 教程继续学习。