Singleton类和使用继承

问题描述:

我正在使用帮助类的Web应用程序工作。这些类保存了各种操作的功能,例如表单处理。Singleton类和使用继承

有时我需要这些类在我的应用程序中的多个位置,现在我做的方式是创建一个新的对象。我无法传递变量,这将是太多的工作。

我想知道为此使用单例类。这样我确信一次只能运行一个实例。

但是我的问题是,当我使用这种模式时,我应该为所有对象创建一个单例类,这会导致很多代码复制。

我可以改为创建一个superHelper的超类,它是一个单例类,然后让每个助手扩展它。

这种设置工作,还是有另一种选择?

如果有效,有人对如何编写superHelper类有任何建议。

谢谢你们

+0

你的助手类是否保持任何状态,或者他们的方法是静态的吗? – 2010-03-08 13:37:57

+0

一些持有声明,有些可以用作静态,我不认为这个评论帮助了很多 – 2010-03-10 14:18:44

我无法通过变量,这将是太多的工作。

你确定吗?人们倾向于高估传递依赖的努力。如果你在构造函数中这样做,通常很简单。

这就是说,你可以把共享功能放在全局范围内,以不同的方式在php中。最简单的是使用全局函数。例如。一个不属于任何类的函数。另一种选择是使用静态类方法。这两个非常相似;除了它们的语法外,它们基本上具有相同的属性。稍微宽松的耦合解决方案是将函数作为方法放在(抽象)基类上,即具体的类继承自。这共享所有子类之间的功能。

上述解决方案的共同之处在于它们具有编译时耦合。您不能在运行时更改依赖项,这会使您的应用程序变得非常严格。他们的主要好处是他们携带的复杂程度低。

如果你想要一个宽松的耦合应用程序,你可以尝试用一个变量来替换硬依赖关系,以提供一个间接级别。简单的做法是创建一个对象,并在整个应用程序中进行全局共享。有许多方法可以在PHP中执行此操作,例如单例或全局范围内的变量(您可以使用global关键字或$GLOBALS阵列访问此方法)。

虽然全局变量提供了一个间接的级别,但它们也倾向于引入很多复杂性,因为它们使得很难弄清楚应用程序中依赖于对方的部分。出于这个原因,他们经常被有经验的程序员避免。如果变量具有状态,则尤其如此;如果共享对象是无状态的,则问题不太普遍。

避免全局变量风险的唯一方法是使用局部变量。例如。传递依赖关系。这可能有点麻烦,但以我的经验来看,它通常并不像问题那样严重。至少,好处通常超过问题。也就是说,有一些技巧可以使疼痛轻松起来;值得注意的是依赖注入容器,这是自动工厂,负责照顾所有的线路。他们虽然有自己的复杂程度,但对于大型应用程序来说,它们肯定是一个很好的解决方案。

+0

谢谢你的回应,我明白每一点的优点和缺点。我将尝试仅在本地变量中传递助手。 – 2010-03-10 14:22:17

虽然有时是必要的,单身是邪恶的(因为它们是全局状态)。尽量避免它们,如果你能帮助它。

编辑:如果你不能避免单身人士,至少参数化该状态的引用。换句话说,在一个类中,将单例传递给它的构造函数或那些使用单例的方法。

简单地将您的代码库引用到您的单例中会危及您单独测试类的能力。

如果您的单身人士有状态,您的测试将突然变为有状态,并且您的测试可能开始“级联失败”,因为他们的先决条件由于先前的测试失败而被破坏。

+0

解释downvote的评论将不胜感激。 – 2010-03-08 14:19:05

+0

我没有downvote。我认为所有的回应都很好,因为我不确定首先使用单身模特。 – 2010-03-10 14:17:52

不能扩展一个单独的类。请记住,在单例类中,构造函数是私有的,所以如果构造函数是私有的,那么如何扩展这个类呢?我们都知道我们创建了一个我们称之为构造函数的类的对象,而在子类构造函数中,它隐式地称为父构造函数。所以在这种情况下,私人构造函数不能在子类中调用。