插件设计模式解释(如 Martin Fowler 所述)

The plugin design pattern explained (as described by Martin Fowler)

我正在尝试理解和练习 plugin pattern,正如 Martin Fowler 所解释的那样。

我可以理解它以何种方式利用了 separated interface 模式,并且它需要工厂根据当前使用的环境(测试、生产、开发)提供接口的正确实现, ETC)。但是:

非常感谢。

您将希望获得 "Patterns of Enterprise Application Architecture" 的完整 PFD。 Fowler 网站上可见的基本上是任何章节的前半页:)
描述的基本上是polymorphism.

背后idea的扩展版

我不认为 "plugin" 实际上可以描述为 "pattern"。它更像是其他设计选择的结果。

你拥有的是.. emm ... "packages",其中每个中的主要 class 实现了第三方接口。这些包中的每一个也有它们的内部依赖项(其他 classes 甚至其他库),用于某些特定任务。每个包都有其配置(可以通过 DIC 配置添加),并且每个包都在您的主应用程序中获得 "registered"。

提到工厂几乎就是 red herring,因为如今该功能将使用 DIC 来应用。

插件模式的目标是提供集中配置运行时以促进模块化和可扩展性。确定 select 实现的标准可以是环境,或其他任何东西,如帐户类型、用户组等。工厂只是根据 select 创建所需插件实例的一种方法离子标准。

实施选择标准

您的工厂如何读取 selection 标准(环境状态)取决于您的实施。一些常见的方法是:

  • Command-Line Argument,例如,来自不同 CI/CD 管道阶段的 CLI 调用可以传递一个 dev/staging/production 参数
  • YAML Config Files 可以反序列化为对象或解析
  • Class Annotations 用环境标记每个实现
  • Feature Flags,例如类似 Launch Darkly
  • 的 SaaS
  • Dependency Injection 框架类似 Spring IoC
  • Product Line Engineering 类似 Big Lever
  • 的软件
  • REST Endpoint,例如http:///localhost/test/order 可以在不通知任何客户的情况下创建测试订单对象
  • HTTP Request Parameter,例如header或body中的某个字段

对工厂的依赖

由于 DomainObject 调用工厂来创建具有所需实现的对象,因此工厂将成为域对象的依赖项。也就是说,现代方法是使用依赖注入 (DI) 库 (Guice, Dagger) or a framework with built-in DI (Spring DI, .Net Core)。在这些情况下,仍然依赖于 DI 库或框架,但没有明确依赖于任何工厂 class.

Note: The Plugin design pattern described on pp.499-503 of PEAA was written by Rice and Foemmel, not Martin Fowler.