gpt4 book ai didi

FooProvider/FooManager 和 Foo 对象的 Java 创 build 计模式

转载 作者:行者123 更新时间:2023-12-02 09:37:04 27 4
gpt4 key购买 nike

最近,我开发了一个用户友好的库,它将为用户提供资源对象。这个Resource对象将由我的ResourceProvider/ResourceManager/ResourceFactory实例化,ResourceProvider/ResourceManager/ResourceFactory可能根据不同的上下文有不同的实现;

此外,ResouceProvider/ResourceManager/ResourceFactory 将根据资源名称在整个应用程序中对资源对象进行缓存。

ResourceManager mgr = ResourceManager.getInstance(context);
Resource r = mgr.getResource('myName')

我的第一个想法是使用静态工厂方法。我的问题是,对于这种情况最好的模式是什么。我认为构建器模式有点矫枉过正,因为只有一个上下文参数。欢迎任何想法!!

最佳答案

那么您的问题是关于 API 设计的?

您的 API 设计很常见,但也并非没有需要考虑的缺点。通过您的方法,ResourceManager 的每个实例也必须扩展 ResourceManager 类,这有一些缺点:

  • 所有实现与 ResourceManager 紧密耦合。
  • 如果ResourceManager还扩展了一些不受您控制的其他类,则很难。
  • 违反 interface segregation principle ,因为实现不需要 getInstance 方法,而是通过 ResourceManager 提供它。

从架构的角度来看,使用 ResourceManager 作为接口(interface)和用于获取实现的额外提供程序的设计会更好:

ResourceManager mgr = ResourceManagerProvider.getInstance(context);

但是,还剩下一个问题:

最干净的方法是不使用外部静态方法:

ResourceManager mgr = new ResourceManagerProvider().getInstance(context);

(内部,ResourceManagerProvider 可以使用私有(private)静态方法来获得相同的结果。)

但从用户的角度来看,我认为你的方法更受欢迎,因为易于使用。所以没有模式或“金弹”,只是一个决定。

另一种选择可能是依赖 dependency injection ,但这很大程度上取决于您的要求。使用依赖注入(inject)首先要求您的库的用户使用与您相同的依赖注入(inject)框架,并且如果您可以注入(inject)所需的上下文,则必须有意义。通过依赖注入(inject),用户不会直接请求 ResourceManager,而是从框架注入(inject)它。

关于FooProvider/FooManager 和 Foo 对象的 Java 创 build 计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57424664/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com