“单例”工厂,好还是坏?

2024-01-09

我有很多(抽象)工厂,它们通常作为单例实现。

通常是为了方便,不必将它们传递给实际上与使用或了解这些工厂无关的层。

大多数时候我只需要在启动时决定哪个工厂实现其余的代码程序,也许通过一些配置

它看起来例如喜欢

abstract class ColumnCalculationFactory { 
  private static ColumnCalculationFactory factory;
  
  public static void SetFactory(ColumnCalculationFactory f) {
    factory = f;
  }

  public static void Factory() {
    return factory;
  }

  public IPercentCalculation CreatePercentCalculation();
  public IAverageCalculation CreateAverageCalculation();
   //....
}

有些东西确实闻到了这一点,我只是不确定是什么 - 它可能更像是一个隐藏的全局而不是一个单例。这并不像真的那样have to成为唯一一个创建 ColumnCalculations 的工厂 - 尽管我的程序不需要更多。

这被认为是最佳实践吗?我应该将它们填充到一些(半)全局 AppContext 类中吗?还有什么(我还没有准备好切换到更大的 IoC 容器,或者 spring.net 顺便说一句)?


这实际上取决于您正在做什么以及您的应用程序范围。如果它只是一个相当小的应用程序,并且永远不会超出这个范围,那么您当前的方法很可能没问题。这些事情没有通用的“最佳”实践。虽然我不建议将单例用于无状态叶方法和/或单向调用(例如日志记录)之外的任何内容,但“仅仅因为”它是单例而立即忽略它并不一定是正确的做法。

对于除琐碎代码或原型代码之外的任何内容,我个人喜欢通过构造函数注入显式使用控制反转,因为这意味着所有依赖项都被考虑在内,并且您不会得到任何“惊喜”。编译器不会让你实例化没有 B 的 A 和没有 C 的 B。单例会立即埋葬这些关系——你可以实例化没有 B 的 A 和没有 C 的 B。当从 A 到 B 的调用发生时,你将得到一个空引用例外。

这在测试时尤其烦人,因为您必须通过运行时故障迭代地向后工作。当您测试代码时,您就像其他编码员一样使用 API,因此这表明了这种方法的设计问题。构造函数注入确保这种情况永远不会发生——所有依赖项都已预先声明。构造函数注入的缺点是对象图的配置更加复杂。通过使用 IoC 容器可以缓解这种情况。

我想我想说的是,如果您已经考虑使用某种上下文对象和注册表模式,那么您不妨看看 IoC 容器。当您可以使用像 Autofac 这样成熟的免费产品时,努力推出自己的 mutt 版本可能是浪费时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“单例”工厂,好还是坏? 的相关文章

  • 线程安全枚举单例

    枚举非常适合创建单例 我知道枚举方法不是线程安全的 所以我尝试使其成为线程安全的 任何人都可以确认此实施是否正确 这么多地方用static和volatile好不好 可以优化吗 由于内部类是私有的 所以我必须在枚举中创建函数来访问内部类功能
  • 简单来说,什么是工厂?

    什么是工厂 我为什么要使用工厂 你熟悉吗JDBC https docs oracle com javase tutorial jdbc basics index html 这是一个完整的 抽象 工厂 这是一个很好的现实世界例子 Factor
  • 为什么我的闭包函数不想在 if 语句中重新分配其父函数变量?

    我创建了这个工厂函数 用于描述游戏逻辑 我使用内部函数来切换游戏中的玩家 问题是 当我尝试从内部函数中重新分配当前玩家时 它不起作用 当前的玩家永远不会改变 我想这是关于封闭的一些事情 我并没有真正理解 你能向我解释一下我缺少什么吗 这是我
  • 跨模块单例

    我正在尝试实现单例 但在导入模块时遇到了困难 我的设置如下 我正在使用Python 2 7 MODULE 1 class SingletonClass object def new self args kwargs if not self
  • 如何让 Rust 单例的析构函数运行?

    这些是我所知道的在 Rust 中创建单例的方法 macro use extern crate lazy static use std sync Mutex Once ONCE INIT derive Debug struct A usize
  • 为什么这个工厂返回 $$state 对象而不是 response.data?

    所以我在服务器中有一个对象集合 我想在页面加载时填充 ng repeat 我创建了一个工厂 它从服务器上的资源中获取列表 如下所示 app factory objectArray http function http This is ret
  • 我的 Objective-C 单例应该是什么样子? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Singleton 对象 - 在静态块中或在 getInstance() 中;应该使用哪个

    下面是两种实现单例的方法 各自的优点和缺点是什么 静态初始化 class Singleton private Singleton instance static instance new Singleton public Singleton
  • 定义 ADT 时案例对象 T 和案例类 T() 之间的区别?

    假设在 scala 中我有一个 ADT 如下所示 sealed trait Animal object Animal case class Lion name String extends Animal case class Elephan
  • 从其他进程向 WPF 单例应用程序发送数据

    我有一个 WPF 单例应用程序 其中任何时候只有一个实例在运行 如果用户尝试启动另一个实例 我们检查它是否已经在运行 然后我们终止这个新进程并将现有进程置于前面 现在 我们需要从另一个进程 可以是 xls word 或另一个独立应用程序 打
  • Android 中的静态单例生命周期

    我有一些不清楚的情况 最后一个持有 Activity 的引用被销毁后 静态单例会被垃圾回收吗 因为Application中没有更多对单例实例的引用 那么我可以依赖单身人士吗 由官方提供安卓文档 http developer android
  • 单例类 iPhone

    好吧 我试图避免全局变量 所以我阅读了单例类 这是尝试设置和读取可变数组 但结果为空 Content h interface Content NSObject NSMutableArray contentArray Content shar
  • 如何在 Objective-C 中调试单例

    我的应用程序包含几个单例 以下是本教程 http cocoawithlove com 2008 11 singletons appdelegates and top level html 然而 我注意到 当应用程序因单例而崩溃时 几乎不可能
  • Boost python 导出单例

    我有一个单例 来自 boost serialization class LogManager public boost serialization singleton
  • Meyers 的单例实现实际上是如何实现单例的

    我读了很多关于单例的内容 什么时候应该使用它们 什么时候不应该使用它们 以及如何安全地实现它们 我正在用 C 11 编写 并且遇到了 Meyer 的单例延迟初始化实现 如所示这个问题 https stackoverflow com ques
  • 在 Delphi XE 中将类作为过程的参数传递

    我需要做的是这样的 procedure A type of form var form TForm begin form type of form Create application form showmodal freeandnil f
  • JavaScript 中的单例模式

    下面是 JavaScript Singleton 模式的一个非常流行的实现示例 var mySingleton function var instance function init function privateMethod conso
  • 在实现接口的类上强制使用单例模式

    我最好用一个例子来解释这个问题 我有一个接口模型可用于访问数据 模型可以有不同的实现 可以以各种格式表示数据 例如 XMl txt 格式等 Model不关心格式 可以说这样的一个实现是myxml模型 现在我想强迫myxml模型以及其他所有实
  • MVC和依赖注入,被迫使用单例Controller?

    我正在致力于构建一个根据 MVC 原则运行并利用依赖注入的 PHP 框架 我想我已经把前端控制器部分放下了 有一个工作路由器实例化控制器实例并根据请求的 URI 调用适当的操作 接下来是依赖注入 我想实现一个使用反射解决依赖关系的容器 这样
  • 单例属性

    好吧 如果我创建一个单例类并通过公共静态属性公开单例对象 我明白了 但我的单例类还有其他属性 这些应该是静态的吗 这些也应该是私人的吗 我只想通过执行以下操作来访问单例类的所有属性 MySingletonClass SingletonPro

随机推荐