快速浏览Java中常见和有用的模式

139 阅读6分钟

模式是从开发人员那里汲取的智慧和教训,这些开发人员多年来一直在为大多数常见问题设计解决方案。不使用它们会很天真,尤其是当我们面对类似情况时。但是,在使用它们之前,我们必须了解它们的实现宗旨。在我们的日常编程中,有许多此类模式可利用。本文选择了其中最常见的一些,并展示了如何以简单的方式实现。

总览

马丁·福勒(Martin Fowler)说:“...模式的关键部分在于它们扎根于实践。你可以通过观察人们的行为,观察有效的事情来找到模式。” 找到一个模式并不总是那么容易,但是一旦找到,它们就非常有价值。设计模式应被视为良好的建议,这是经验的支持,而不是一种天意。根据现有的模式可以解决类似的问题,但是同样可能存在例外。

说了这么多,我们在这里讨论的模式如下:Singleton,Utility,Factory和DependencyInjection。请注意,我们之所以选择这些并不是因为它们是最常见的四个,而是因为它们只是最常见的四个。让我们深入研究。为了实现,我们将使用Java作为语言。

单例模式

该单件模式,从开发者的主要需求演变为创建一个类,保证只有一个类的单个实例可以在任何给定时间点创建。人们可能在某种程度上不同意该假设不完全符合线程安全性原则。但是,经验表明,在某些情况下我们确实需要它们。从实现的角度来看,这是最简单的模式。这种设计的原始版本可能如下所示:

但是,上述简化代码存在问题。多个线程不能同时调用它,因为它将创建多个实例。克服此限制的一种方法是如下修改代码。请注意,这是一个非延迟实现。

如果我们要确保不浪费资源并仅在需要时才懒惰地创建实例,则可以通过显式同步来实现。这样可确保在多线程环境中的低并发性。

我们必须了解,在项目中具有许多单例模式是绝对不可以的。这意味着类设计不正确,需要重新考虑。另外,单例模式使代码难以测试。最好改用依赖注入,因为我们可能认为我们需要一个Singleton模式。

效用模式

该实用程序或辅助模式是非常有用的创建一个非实例化类。因为Java通过使用final关键字使它变得容易,所以在这里我们将集中在不使用final的情况下实现。实用程序或帮助程序类通常有助于将各种无关的方法放在一个地方。但是,这不是一个好主意,如果我们要遵循面向对象的重用原理,代码的简洁性等,则最好避免,但是似乎我们无法完全避免它们。因此,实用程序模式确实具有一定的实用性!

现在,如果要在代码中实现此模式,则在类中声明的方法都应该是static。就像你可能已经猜到的,如果我们不使用final关键字,那么确保非示例性的唯一方法是将构造函数声明为私有。Java具有final关键字的优势,但是其他面向对象的语言(例如C ++)可能没有该选项。因此,将构造函数声明为私有是实现此模式的方法。

工厂方法模式

该工厂方法模式是一种极为有用的图案,并已在Java API设计中广泛使用,例如,从工厂方法抽象工厂。这个想法是使用一个接口来创建一个对象,但是最终一个子类将决定实例化哪个类。因此,目标是通过允许系统确定要在运行时实例化的类来推迟创建对象。工厂方法模式的一个简单实现是返回特定类的对象的静态方法。

这是一个非常幼稚的实现。我们可以通过使用接口或抽象类,换句话说,使用抽象工厂,将代码修改为另一个变体。这种模式利用了代码的可读性。

请注意,工厂类如何能够以通用方式创建任何类型的Employee对象。 依赖注入 的依赖注入模式也被称为控制反转。顾名思义,如果一个类的实例依赖于另一个类的实例,则必须通过构造函数,setter或strategy注入对象来满足依赖关系,而决不要创建对象本身。使用此模式可利用类之间的松散耦合,可扩展性和更好的代码维护。 让我们创建一个场景以更好地理解依赖注入。以下代码演示了不使用依赖模式的汽车服务场景。该代码是不言自明的。
上面的代码看起来还不错,但是有一些限制,例如, 该CarApp初始化CarService ; 这意味着它紧密耦合且高度依赖。CarService的升级将产生不良的连锁反应。这些限制了可扩展性和可维护性。同样,这种高度依赖的代码很难测试。 现在,如果我们对以上问题应用依赖项注入模式并重新设计代码,请观察紧密耦合如何破裂。第一个目标是创建服务组件。
接下来,我们创建服务使用者类。
接下来,我们创建依赖注入器类。
最后,我们可以编写客户端代码来测试模式。
注意如何仅在喷射器中创建服务类。我们可以扩展代码以提供许多其他汽车服务,而不会对现有代码产生任何影响。这使我们的代码足够灵活以适应任何扩展。依赖项注入模式的好处如下:

减少样板代码

利用关注点分离

扩展灵活

易于测试

不过要谨慎一些;绝对不能过度使用依赖项注入,因为它可能导致不必要的维护问题。此外,由于有时会隐藏服务类,因此仅在运行时才能捕获在编译时会出现的错误。这在调试时会带来困难。

结论

这些只是日常编程中使用的快速流行的四种模式。在这里,我们试图给出仅四个的快速概述。还有很多其他的 依赖项注入模式稍微复杂一些,但是到目前为止,这是解决关注点分离问题的最佳方法。完全可以在编程时不使用任何模式,但是问题是,如果我们找到匹配项,为什么不使用一个模式。有经验的程序员总是尝试在模式列表中找到解决方案,并在可能的情况下使用它们。