解释这个单件工厂模式

时间:2012-03-09 17:16:34

标签: php design-patterns singleton pdo factory-pattern

class ConnectionFactory
{
    private static $factory;
    public static function getFactory()
    {
        if (!self::$factory)
            self::$factory = new ConnectionFactory(...);
        return self::$factory;
    }

    private $db;

    public function getConnection() {
        if (!$db)
            $db = new PDO(...);
        return $db;
    }
}

function getSomething()
{
    $conn = ConnectionFactory::getFactory()->getConnection();
    .
    .
    .
}

Source

有几件我不懂的东西

  1. 当我说“在不启动课程的情况下可以访问课程的staic属性”时,我是对的。
  2. !db做什么
  3. 这是怎么回事ConnectionFactory::getFactory()->getConnection();
  4. 有人可以解释getFactory方法

4 个答案:

答案 0 :(得分:3)

  1. 你就在这里。
  2. !不是。这意味着如果$ db为false则初始化它。由于它在静态方法中,它将保持初始化状态,并且下次从第二次返回existiong $ db!$ db == false。
  3. 喜欢$ db,它检查$ factory的实例是否存在,如果没有创建一个并返回它,否则返回现有的。
  4. 4

    public static function getFactory()
    {
         if (!self::$factory) // is self::$factory initialised?
                self::$factory = new ConnectionFactory(...); //initialise it
         return self::$factory; //return self::$factory
    }
    

    此外,$ factory似乎是一个设置在某处的变量。据推测,它可能包含几个不同的类名。不会改变函数的工作方式。它是单身模式

    添加有关此模式的有趣链接wikipedia

答案 1 :(得分:1)

对于1.是,可以使用ClassName :: $ staticvarname

始终访问类的静态属性

对于2.肯定存在一个错误。应该是if(!$ this-> db)和getConnection中的所有代码都应该使用$ this-> db而不是$ db。

getFactory()在这里是Singleton模式的更标准的getInstance()的“别名”。 它返回类的单个实例,如果存在&如果不存在则创建单个实例。

getFactory() - > getConnection()调用很简单: getFactory()返回ConnectionFactory类的单个实例。 因此,现在您拥有Singleton实例,您可以对其执行任何调用。 getConnection()返回由单例处理的“单个”PDO实例(存储在$ db成员中)

答案 2 :(得分:1)

  1. 正确
  2. !是NOT运算符。基本上如果(!$ db)表示$ db为null,则执行if块
  3. get factory是一个返回ConnectionFactory(单个)实例的函数,这个实例有一个函数getConnection()
  4. 在单例模式中,只应存在一个类的实例,它是类本身的私有静态成员。 getFactory()函数是获取对此单个实例的引用的方法(如果它为null,则首先初始化该实例)。

答案 3 :(得分:1)

  1. 是的,static表示对于请求它的每个对象它将是相同的值,因此不需要实例化
  2. !表示NOT。它通常被视为!=,表示NOT EQUAL。在这种情况下,正在检查是否已创建db对象,因此这意味着db为NOT NULL
  3. 3& 4.您指定的方法是使用该类(不实例化它),并调用getFactory()。如果是NOT NULL,将创建该因子,否则,它将返回已创建的工厂。之后,它使用返回的工厂的instance请求连接。由于只有一个工厂,我们可以假设一旦连接被实例化(与工厂实例化的方式相同),那么该连接将可用于工厂前进的所有用途

    我建议阅读关于Singleton模式的wikipedia article。希望这可能有用。 同样,请记住,一般来说,单身模式被认为是一种应该避免的反模式。在我看来,这个类可以很容易地创建为带有静态getConnection方法的静态类。随着代码的显示,似乎在这里创建它本身毫无意义。但是,这只是在这个小范围内。