Статьи

Шаблоны проектирования в WordPress: шаблон Singleton

В этой серии мы рассмотрим значение шаблонов дизайна и роли, которые они играют в разработке WordPress.

В первом посте этой серии мы провели опрос высокого уровня и даже рассмотрели шаблон наблюдателя, чтобы увидеть, как можно зарегистрировать различные функции или объекты с определенными событиями, которые происходят в жизненном цикле приложения.

В этом посте, где мы рассмотрим шаблон Singleton.

В частности, мы собираемся взглянуть на определение шаблона и как он работает, мы рассмотрим диаграмму того, как выглядит архитектура шаблона, мы рассмотрим пример кода для шаблона, а затем мы обсудим преимущества паттерна в том, что касается разработки на WordPress.


Википедия определяет шаблон Singleton следующим образом:

В разработке программного обеспечения шаблон синглтона — это шаблон проекта, который ограничивает создание экземпляра класса одним объектом.

Возможно, более простой способ объяснить шаблон заключается в следующем: шаблон Singleton гарантирует, что у класса может быть только один экземпляр, и предоставляет единственный способ извлечения самого экземпляра.

Что касается разработки темы, лично я не вижу в ней особой пользы, если вы не объединяете некоторый тип вспомогательного класса или библиотеки со своей темой; однако, если вы создаете плагины, это может быть исключительно полезным.

На данный момент существует только несколько способов создания плагинов (исключая виджеты — это другая тема) в WordPress:

  • Вы можете создать плагин в нижней части файла плагина, но это может привести к появлению осиротевшего объекта.
  • Вы можете вставить плагин в коллекцию PHP $GLOBALS , но это может быть опасно, так как вы можете уничтожить то, что уже существует, или это делает коллекцию излишне большой
  • Если вы создаете его, скажем, с каждой загрузкой страницы, то данные не сохраняются, если вы не сериализуете и не забиваете базу данных каждый раз, когда создается экземпляр плагина.

Ни одно из вышеперечисленного не является особенно хорошей стратегией (хотя вы могли бы доказать, что все они работают).

Тем не менее, мы заботимся больше, чем просто заставить что-то работать, верно? Мы хотим, чтобы это работало, и мы хотим элегантного решения проблемы. Именно здесь в игру вступают шаблоны проектирования, в частности, шаблон Singleton.


Сначала давайте взглянем на диаграмму синглтон-паттерна. Посмотрите на схему ниже, тогда мы поговорим об особенностях после изображения:

Синглтон

Итак, вот ключевые особенности шаблона Singleton:

  • Существует частная, статическая переменная экземпляра, определенная в атрибутах, которая используется для поддержки ссылки на класс
  • Конструктор был помечен как приватный
  • Существует открытая статическая функция с именем get_instance которая используется для возврата экземпляра класса

Ничего сложного, но я думаю, что рассмотрение кода для Singleton Pattern делает его более понятным, поэтому давайте сделаем это сейчас:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class Foo {
 
    /*———————————————*
     * Attributes
     *———————————————*/
 
    /** Refers to a single instance of this class.
    private static $instance = null;
 
    /*———————————————*
     * Constructor
     *———————————————*/
 
    /**
     * Creates or returns an instance of this class.
     *
     * @return Foo A single instance of this class.
     */
    public static function get_instance() {
 
        if ( null == self::$instance ) {
            self::$instance = new self;
        }
 
        return self::$instance;
 
    } // end get_instance;
 
    /**
     * Initializes the plugin by setting localization, filters, and administration functions.
     */
    private function __construct() {
 
    } // end constructor
 
    /*———————————————*
     * Functions
     *———————————————*/
 
} // end class
 
Foo::get_instance();

Очевидно, что из вышеприведенного класса осталось много кода, но принципы шаблона остаются.

Обратите внимание, что у нас есть закрытая статическая переменная экземпляра, которая используется для ссылки на этот класс. В частности, это установлено в функции get_instance тогда как конструктор был помечен как закрытый.

Как правило, при создании экземпляров классов конструктор — это функция, которая вызывается всякий раз, когда мы инициализируем классы; однако в этом случае конструктор помечается как закрытый.

Так что же дает?

Обратите внимание, что у нас есть get_instance функция get_instance чуть выше конструктора. Эта функция буквально проверяет, является ли статическая переменная экземпляра null и, если это так, создает новый экземпляр класса (что она может сделать, поскольку она находится в контексте класса); в противном случае он возвращает текущий экземпляр.

Так создается не более одного экземпляра класса.

Наконец, обратите внимание, что мы создаем экземпляр класса не стандартным ключевым словом new , а вызывая get_instance . Не только это, но мы также получаем будущие ссылки на класс, используя тот же метод.

Например, предположим, что вы работаете в другом шаблоне и вам нужно вызвать функцию — скажем, bar() — которая существует в вашем плагине. В этом случае вы бы сделали что-то вроде этого:

1
2
$foo = Foo::get_instance();
$foo->bar();

Довольно аккуратно, не правда ли?


Несмотря на то, что мы рассмотрели шаблон Singleton с архитектурной и практической точки зрения, на самом деле мы не говорили о преимуществах шаблона.

Вообще говоря:

  • Шаблон Singleton предотвращает дублирование экземпляров класса другими объектами или клиентами. Это гарантирует, что в любой момент времени поддерживается только одна копия данных. Весь доступ к объекту осуществляется одним экземпляром.
  • Когда дело доходит до реализации, мы обладаем широким спектром гибкости, поскольку на самом деле можем влиять на процесс создания экземпляра (хотя это немного выходит за рамки данной статьи).

Возможно, самым большим недостатком использования шаблона является отсутствие ясности в том, что плагин действительно использует шаблон. Если кто-то попытается создать экземпляр класса, создание экземпляра завершится неудачей, потому что нет открытого конструктора.

Таким образом, документация является ключевой.


Независимо от того, видели ли вы их раньше или это ваше первое знакомство с шаблонами проектирования, шаблон Singleton, возможно, является самым простым шаблоном проектирования. Его легко реализовать, и он обеспечивает значительный источник функциональности при правильной реализации, особенно в том, что касается веб-приложений.

В следующем посте мы рассмотрим другой шаблон — простой шаблон фабрики — который полезен, когда у вас есть несколько классов, каждый из которых имеет уникальное назначение и будет необходим на основе определенных критериев ввода.