我的Factory对象是否引入了全局状态?

时间:2011-04-08 10:37:50

标签: dependency-injection factory globals

所以,这是交易。我设法在不使用全局变量或静态类/函数的情况下创建框架。

我正在使用一种使用Factory的依赖注入形式。由于框架将用于各种事情,我正在创建一个更通用的工厂,它将构建您的类,并以递归方式依赖它。

为了节省内存,每次实例化对象时,Factory都会存储对它的引用,因此如果另一个对象对该对象有依赖关系,Factory只需要返回引用。这样我们就不需要两次实例化同一个对象了。

这意味着,在很多类中,我们将对同一个对象有许多不同的引用。例如,如果我声明Blog_model,Blog_controller,Blog_view,Form_validation要求Config对象,则每个都将使用对同一Config对象的引用进行实例化,尽管是注入。

我不熟悉单元测试或任何类型的自动测试。我刚刚发现使用全局变量和静态都很糟糕(这就是为什么我要重写我使用的框架)。我想问的是,这会引入全球状态吗?它会以任何方式妨碍测试吗?

----更新------

这是一个用PHP编写的MVC框架。

2 个答案:

答案 0 :(得分:3)

据我读到这个问题,你基本上创建了一个只支持单一生活方式的依赖注入容器

与DI密切相关的是终身管理的概念。如果我们多次要求特定类型的实例,我们每次都会得到相同的引用,或者每次都得到一个新的实例?

如果我们每次称之为 Singleton生活方式时都会得到相同的实例 - 不要与Singleton设计模式混淆。

如果我们每次称之为瞬态生活方式,我们都会获得一个新实例。

还有其他类型的生活方式,如范围,汇集等,但以上两种是最基本的生活方式。

听起来我的DI容器只支持Singleton的生活方式。此与全局状态不同,但状态 在容器的单个实例中共享。但是,如果你扔掉容器实例,你也会抛弃共享状态,所以摆脱全局状态要容易得多。

答案 1 :(得分:2)

是的,它确实引入了一个全局状态,因为你的工厂返回对刚刚创建的对象的引用。

你没有说你正在使用哪种语言,但如果你使用的是c ++,你的工厂方法应该返回一个shared_ptr(shared_ptr的类型应该是你正在创建的对象的基类)。