插件设计模式解释(如 Martin Fowler 所述)
The plugin design pattern explained (as described by Martin Fowler)
我正在尝试理解和练习 plugin pattern,正如 Martin Fowler 所解释的那样。
我可以理解它以何种方式利用了 separated interface 模式,并且它需要工厂根据当前使用的环境(测试、生产、开发)提供接口的正确实现, ETC)。但是:
- 工厂究竟如何读取环境值并决定创建哪个对象(实现
IdGenerator
接口)?
- 工厂是否是域对象的依赖项 (
DomainObject
)?
非常感谢。
您将希望获得 "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.
我正在尝试理解和练习 plugin pattern,正如 Martin Fowler 所解释的那样。
我可以理解它以何种方式利用了 separated interface 模式,并且它需要工厂根据当前使用的环境(测试、生产、开发)提供接口的正确实现, ETC)。但是:
- 工厂究竟如何读取环境值并决定创建哪个对象(实现
IdGenerator
接口)? - 工厂是否是域对象的依赖项 (
DomainObject
)?
非常感谢。
您将希望获得 "Patterns of Enterprise Application Architecture" 的完整 PFD。 Fowler 网站上可见的基本上是任何章节的前半页:)
描述的基本上是polymorphism.
我不认为 "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 IoCProduct 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 ofPEAA
was written by Rice and Foemmel, not Martin Fowler.