没有单例的PHP前端控制器实现:概念性问题

fat*_*fat 6 php model-view-controller front-controller

我有关于php中前端控制器实现的"概念"问题.

我见过的大多数前端控制器是用Singleton实现的,我不是单例模式的忠实粉丝,我创建了一个具有静态属性的Container,它将存储一个前端控制器的单一实例.

使用singleton,我必须将初始化代码放在构造函数(或构造函数调用的方法)中:

$fc = FrontController::getInstance();
Run Code Online (Sandbox Code Playgroud)

使用容器我可以将配置放在FrontController之外,这是我的目标,我仍然有一个简单的方法来检索FrontController.

$fc = Container->getFrontController();
Run Code Online (Sandbox Code Playgroud)

这段代码看起来更干净,我可以得到干净的子类,而不关心父构造函数.

在'bootstrap'时间这是完全相同的事情,但实际上与我之前的实现的区别在于,现在我可以在应用程序的任何地方(在DAO内部或Action内部)创建FrontControllers,因为构造函数不再是私有/受保护的.

我的问题是: 给我的类用户提供在应用程序的任何地方创建FrontController实例的可能性是一种"不好的做法"吗?我会写文档并与其他类交付容器,但我仍然想知道我是否应该防止奇怪的用途.

Man*_*kis 2

是否有真正的理由在应用程序内创建 FrontController 实例?如果有那就继续吧。否则我对此有点怀疑,因为它可能会让以后的事情变得复杂。我担心的是有人在有更简单的方法时使用新的 FrontController 实例,要么是出于懒惰,要么是因为他们不知道更好的方法。一旦发现一些可行的方法,有些人就会倾向于继续这样做,即使有更好的方法。永远不要忘记,您可能必须与不如您的人一起工作。

就我个人而言,我会隐藏这一点或完全不允许它。不过,我会在以后的版本中记住这一点。如果您偶然发现它是最佳选择的情况,请将其添加到您的“官方”界面。

不要忘记,一旦你将一个函数释放到野外,就很难将其杀死。