Объясните этот шаблон синглтон-фабрики - PullRequest
3 голосов
/ 09 марта 2012
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();
    .
    .
    .
}

Источник

Есть пара вещей, которые я не получаю

  1. Прав ли я, когда говорю "staic свойство классаможно получить доступ без инициализации класса "
  2. что делает !db делает
  3. Как это происходит ConnectionFactory::getFactory()->getConnection();
  4. Может кто-нибудь объяснить getFactory метод

Ответы [ 4 ]

3 голосов
/ 09 марта 2012
  1. Вы здесь.
  2. !НЕЭто означает, что если $ db равно false, инициализируйте его.Так как он в статическом методе, он останется инициализированным, и в следующий раз existiong $ db будет возвращен с этого второго раза!существует, если не создать его и вернуть его, в противном случае вернуть существующий.

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, кажется, является переменной, которая установлена ​​где-то в элементах eles.,Предположительно, он может содержать пару разных имен классов.Ничего не меняет способ работы функции.Это шаблон синглтона

Добавление интересной ссылки об этом шаблоне wikipedia

1 голос
/ 09 марта 2012
  1. Да, static означает, что оно будет одинаковым для каждого объекта, который его запрашивает, поэтому создание экземпляров не требуется
  2. !означает NOT.Чаще всего это выглядит как! =, Обозначая NOT EQUAL.В этом случае проверяется, был ли создан объект db, поэтому это означает, что db имеет значение NOT NULL.

3 & 4. Указанный вами метод говорит использоватькласс (без его создания) и вызов getFactory ().Который создаст коэффициент, если он равен NOT NULL, в противном случае он вернет уже созданную фабрику.После этого он запрашивает соединение, используя instance фабрики, которая была возвращена.Поскольку существует только одна фабрика, то мы можем предположить, что после создания экземпляра соединения (так же, как была создана фабрика), это соединение будет доступно для всех видов использования фабрики с продвижением

Я предлагаю прочитать статью Википедии о шаблонах синглтона.Надеюсь, это может быть полезно. Также , имейте в виду, вообще говоря, синглтон-паттерн считался скорее анти-паттерном, которого следует избегать.Мне кажется, что этот класс так же легко может быть создан как статический класс со статическим методом getConnection.С отображенным кодом кажется, что создание самого себя здесь бессмысленно.Но это как раз в этом небольшом контексте.

1 голос
/ 09 марта 2012
  1. Корректное
  2. ! НЕ оператор В основном, если (! $ Db) означает, что если $ db равно нулю, то выполнить блок if
  3. Get factory - это функция, которая возвращает (единственный) экземпляр ConnectionFactory, этот экземпляр имеет функцию getConnection ()
  4. В шаблоне синглтона должен существовать только один экземпляр класса, который является частным статическим членом самого класса. Функция getFactory () - это способ получить ссылку на этот единственный экземпляр (он сначала инициализирует экземпляр, если он нулевой).
1 голос
/ 09 марта 2012

Для 1. да, статическое свойство класса всегда доступно с помощью ClassName :: $ staticvarname

Для 2. здесь наверняка есть ошибка.это должно быть, если (! $ this-> db) и весь код в getConnection должен использовать $ this-> db вместо $ db.

getFactory () здесь является «псевдонимом» более стандартного getInstance() образца синглтона.Он возвращает единственный экземпляр класса, если он существует, и создает один экземпляр, если он не существует.

Вызов getFactory () -> getConnection () прост: getFactory () возвращает единственный экземпляр класса ConnectionFactory.Теперь, когда у вас есть экземпляр Singleton, вы можете выполнить любой вызов на нем.GetConnection () возвращает «единственный» экземпляр PDO, который обрабатывается синглтоном (хранится в члене $ db)

...