所有Front Classes应该使用单例吗?

时间:2010-10-03 18:52:58

标签: php oop design-patterns front-controller poeaa

考虑Martin Fowler的企业应用程序架构模式,以及Front Controller的模式:http://martinfowler.com/eaaCatalog/frontController.html 显然,它使用单例模式。好吧,我在php应用程序中有一个类的包,它们一起工作(比如Zend的Controller Package),并且有一个类使它们全部可用,因为它类似于Front Controller的大部分概念,我把它命名为PackageName_Front。但它不应该是单例类(而不是前端控制器),所以我仍然让它有名称Front吗?如果没有,我该怎么命名呢? 由于它是一个非常大的包,我只需要它尽可能地遵循约定(不是以教条的方式!)所以它对其他开发人员来说是可读的。

更多信息:这与控制器无关。它只是一个像Zend_Form一样的对象(它将Zend_Form_Element_X和Zend_Validate等所有其他对象的使用合并到一个对象中)但我不能只将它命名为PackageName。它必须是PackageName_Something,而我并不是什么东西应该是什么。也许“处理程序”?...我只是想确定当有人读它的名字时,不要对它在整个包装中的作用感到困惑:)

3 个答案:

答案 0 :(得分:1)

从纯粹的设计视图来看,当你说:

时,听起来就像是在使用PackageName_Front作为Facade
  

有一个课程可以全部完成   可用

福勒对该模式的实施说:

  

前端控制器整合了所有人   通过渠道处理请求   通过单个处理程序请求   对象

这暗示Singleton可能用于实现Front Controller类,但它肯定不会限制它使用它。但他没有明确提到它。

我不认为它是否是一个单身人士是重要的。只需确保它是请求的唯一渠道,您就可以成功使用该模式。 :)

答案 1 :(得分:1)

  

显然, [FrontController] 使用单例模式。

FrontController不必实现为Singleton。这本书没有提出这样的建议。本书中的示例使用了Handler的Servlet。

仅仅因为在应用程序中只需要一次类就不能证明它是作为Singleton实现的。它缺少Singleton的目的,即强制执行一个类只能有一个实例提供对它的全局访问。如果您只需要一次特定实例,请考虑使用Just Create One

现在很多人(包括GoF成名的Erich Gamma)认为Singleton是一种代码气味,并且不鼓励使用它。在无共享架构中,Singleton无论如何都只能限制当前请求中的实例,因此在PHP中的使用是有限的。通过(邪恶的)全局关键字或静态方法,可以在没有Singleton模式的情况下实现对对象的全局访问。全局访问总是创建不需要的耦合。更好的方法是使用依赖注入,它具有提供更少耦合和更好的可维护性的额外好处。

  

所以我仍然让它名为Front吗?如果没有,我该怎么命名呢?因为它是一个非常大的包,我只需要它尽可能地遵循惯例(不是以教条的方式!)

根据我的知识,没有关于命名类 Front 类的约定。您描述的内容可能是FacadeGateway。另外,你确定你不能在PackageName之后命名该类吗?毕竟,Zend_Form包也有Zend_Form类。

答案 2 :(得分:0)

单例模式背后的想法是确保只有一个对象的实例应该只存在于单个实例中。前端控制器非常适合这一类别,因此,使其遵循单一模式也许是明智之举。

但是,如果你的代码总是确保它只调用一次构造函数,那么你的非单例模式对象就有空间。

我在这里2美分,因为我不是任何书籍作者或其他什么。

相关问题