静态方法返回一个类的实例是什么意思?

时间:2014-01-03 11:56:11

标签: php class static singleton

有时当我查看其他人编写的代码时,我会看到如下内容:

<?php

namespace sys\database;

class Statistics {

    public function __construct() {
        // Database statistics are gathered here using
        // private methods of the class and then set to
        // class properties
    }

    public static function getInstance() {
        return new \sys\database\Statistics();
    }

    // ...

}

因此静态函数getInstance()只返回它所属的类的对象。然后,在我遇到的代码中的其他地方:

$stats = \sys\database\Statistics::getInstance();

只需将$stats设置为Statistics对象的实例,就可以访问其类属性以获取各种数据库统计信息。

我想知道为什么这样做而不是仅使用$stats = new \sys\database\Statistics();。在一天结束时,收集统计信息的所有逻辑都在构造函数中,getInstance()方法除了返回新对象之外不会执行任何操作。

这里有什么我想念的吗?

3 个答案:

答案 0 :(得分:4)

这应该是Singleton模式的实现:http://www.oodesign.com/singleton-pattern.html

该模式用于永远不允许创建多个类的实例。

但是,您提供的实现存在一些缺陷:构造函数应该是私有的,并且应该有一个类的私有静态实例,每次调用getInstance方法时都会返回。 / p>

答案 1 :(得分:2)

这应该是Singleton模式的一个实现,它是一个术语,用于描述一个只能在运行时存在一次的类。

看来你的实施是有缺陷的,因为:

  1. 没有检查该类是否存在且
  2. 代码可以通过直接调用构造函数来创建多个实例(它应该是私有的)

答案 2 :(得分:0)

这是Singleton pattern的[不好]实现。

根据经验,你应该避免使用这种模式,例如更方便Dependency Injection