我经常看到这些课程,但我不会在我的项目中使用它们。我正在检查来自here的这些设计模式,我注意到它们使用静态类
从上面的页面中,示例代码:
class AutomobileFactory
{
public static function create($make, $model)
{
return new Automobile($make, $model);
}
}
或以单身模式:
public static function getInstance()
{
static $instance = null;
if (null === $instance) {
$instance = new static();
}
return $instance;
}
答案 0 :(得分:1)
第一个例子是工厂类。工厂是一段代码,可帮助您创建和配置对象。工厂可以是函数或方法,静态类或实例化类。通常没有必要实例化工厂,因此通常使用静态类。但我认为工厂也可以实例化。这样做可以让您配置或扩展工厂,因此它比单一的静态工厂方法更灵活。
另外,我认为在大多数情况下,静态类只是一个借口。人们往往倾向于将全局函数或变量提升为静态类来制作“干净”的代码,但它几乎没有改进。在PHP支持的命名空间之前它有点用处,但是现在,我认为在创建静态类时应该小心。
这同样适用于单身人士,虽然它有其用途,因为在某些情况下你只想拥有一个班级的一个实例。此示例包括连接池或硬件控制器。拥有某个对象的多个实例可能会导致问题,因此这是使用单例的一个很好的理由。 但是人们经常在没有需要时将对象变成单身。在这种情况下,我认为这只是一种隐藏你使用全局变量的事实的方法,这是不好的做法。
但单身人士不是静态阶级。它只是一个隐藏其构造函数的类,并提供了一个静态方法来访问类的单个实例。它与静态类相似,但不一样。
我可以推荐阅读Head First Design Patterns。它以有趣和易懂的方式解释了这两种模式(以及更多)。代码示例倾向于Java,但这几乎不是问题。
答案 1 :(得分:1)
我建议您首先阅读How Not To Kill Your Testability Using Statics作为我将在下面讨论的内容的介绍。
工厂的重点通常是允许依赖注入需要实例化其他对象的方法/对象。 E.g:
public function foo() {
$bar = new Bar;
}
这很糟糕,如上文所述。但是这个方法必须能够实例化Bar
对象本身。然而,我们仍然希望依赖注入
进入工厂:
public function foo(BarFactory $factory) {
$bar = $factory->create();
}
因此,static
工厂毫无意义:
public function foo() {
$bar = BarFactory::create();
}
这里直接实例化new Bar
几乎没有优势。
单身人士是一个热门讨论的话题,他们经常被劝阻,因为不鼓励全球性的对象。静态被提到的单身人士又是坏人,正如文章中详细讨论的那样。
答案 2 :(得分:0)
These classes have a definite use. Let's take an example of a logger.
class Logger() {
private __construct() {}
public static function getInstance()
{
static $instance = null;
if (null === $instance) {
$instance = new static();
}
return $instance;
}
//other methods here
}`
}
现在,在实例化之后,您可以执行类似
的操作记录器::日志(参数)
其中log是该类中的方法。
这只是这样一个类非常有用的一个例子。