Одноэлементный шаблон

редактировать
Диаграмма классов, иллюстрирующая одноэлементный шаблон.

В разработке программного обеспечения, Одноэлементный шаблон - это шаблон разработки программного обеспечения, который ограничивает создание класса класса одним «единственным» экземпляром. Это полезно, когда для координации действий в системе требуется ровно один объект. Термин происходит от математической концепции синглтона ..

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

Содержание
  • 1 Обзор
  • 2 Распространенное использование
  • 3 Реализация
    • 3.1 Реализация Python
    • 3.2 Реализация C #
      • 3.2.1 Реализация Unity
    • 3.3 Ленивая инициализация
    • 3.4 Реализация Dart
    • 3.5 Реализация PHP
    • 3.6 Реализация Java
    • 3.7 Реализация Kotlin
    • 3.8 Реализация Delphi и Free Pascal
  • 4 Примечания
  • 5 Ссылки
  • 6 Внешние ссылки
Обзор

Одноэлементный шаблон проектирования - один из двадцати трех хорошо известных " Шаблоны проектирования «Банда четырех», которые описывают, как решать повторяющиеся проблемы проектирования для разработки гибкого и многоразового объектно-ориентированного программного обеспечения, т. То есть объекты, которые легче реализовать, изменить, протестировать и повторно использовать.

Шаблон проектирования singleton решает такие проблемы, как:

  • Как можно гарантировать, что класс имеет только один экземпляр?
  • Как можно легко получить доступ к единственному экземпляру класса?
  • Как класс может управлять своим экземпляром?
  • Как можно ограничить количество экземпляров класса?
  • Как получить доступ к глобальной переменной?

Одноэлементный дизайн pattern описывает, как решить такие проблемы:

  • Скрыть конструктор класса.
  • Определить общедоступную статическую операцию (getInstance ()), которая возвращает единственный экземпляр класса.

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

Обычное использование
  • Шаблоны abstract factory, factory method, builder и prototype могут использовать синглтоны в своей реализации.
  • Объекты Facade часто являются одиночными, поскольку требуется только один объект фасада.
  • Объекты состояния часто являются одиночными.
  • Синглтоны часто предпочтительнее глобальных переменных, потому что:
    • Они не загрязняют глобальное пространство имен (или, в языках с вложенными пространствами имен, содержащее их пространство имен) ненужными переменными.
    • Они допускают ленивое выделение и инициализацию, тогда как глобальные переменные во многих языках будут всегда потребляют ресурсы.
Реализация

Реализация одноэлементного шаблона должна:

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

Как правило, это делается путем:

Экземпляр обычно хранится как частная статическая переменная ; экземпляр создается при инициализации переменной, в какой-то момент до первого вызова статического метода. Ниже приведен пример реализации, написанной на Java.

public final class Singleton {private static final Singleton INSTANCE = new Singleton (); частный синглтон () {} общедоступный статический синглтон getInstance () {return INSTANCE; }}

Реализация Python

class Singleton (object): __instance = None def __new __ (cls, * args): if cls.__ instance is None: cls.__ instance = object.__ new __ (cls, * args) return cls.__ экземпляр

реализация C #

общедоступный запечатанный класс Singleton {общедоступный статический экземпляр Singleton {get; } = новый синглтон (); private Singleton () {}}

В C # вы также можете использовать статические классы для создания синглтонов, где сам класс является синглтоном.

общедоступный статический класс Singleton {общедоступный статический экземпляр MyOtherClass {получить; } = новый MyOtherClass (); }

Реализация Unity

Синглтоны могут быть полезным инструментом при разработке с Unity из-за уникального способа создания экземпляров классов. Этот метод предпочтительнее скрытия конструктора, поскольку в Unity можно создать экземпляр объекта с помощью скрытого конструктора.

Чтобы предотвратить перезапись экземпляра, необходимо выполнить проверку, чтобы убедиться, что экземпляр равен нулю. Если Instance не равен нулю, GameObject, содержащий вредоносный сценарий, должен быть уничтожен.

Если другие компоненты зависят от синглтона, порядок выполнения скрипта следует изменить. Это гарантирует, что компонент, определяющий Singleton, будет выполнен первым.

класс Singleton: MonoBehaviour {общедоступный статический экземпляр Singleton {get; частный набор; } private void Awake () {if (Instance! = null Instance! = this) {Destroy (this.gameObject); } else {Экземпляр = это; }}}

Примечание: это также можно реализовать, удалив только нарушающий сценарий, но не GameObject, вместо этого вызывая Destroy (this);

Ленивая инициализация

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

открытый конечный класс Singleton {частный статический изменчивый экземпляр Singleton = null ; private Singleton () {} общедоступный статический Singleton getInstance () {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton (); }}} возвращаемый экземпляр; }}

Реализация Dart

1 класс Singleton {2 3 static Singleton _instance; 4 5 статических синглтонов получить экземпляр =>_ экземпляр ?? Синглтон._ (); 6 7 Синглтон._ () =>_ instance = this; 8}

Реализация PHP

1 класс Singleton {2 частных статических $ instance = null; 3 4 частная функция __construct () {} 5 6 публичная статическая функция getInstance (): self 7 {8 if (null === self :: $ instance) {9 self :: $ instance = new self (); 10} 11 12 return self :: $ instance; 13} 14}

Реализация Java

1 открытый класс Coin {2 3 частный статический final int ADD_MORE_COIN = 10; 4 частных монеты int; 5 приватных статических экземпляров Coin = new Coin (); // Активная загрузка экземпляра синглтона 6 7 private Coin () {8 // private, чтобы никто другой не мог создать экземпляр 9} 10 11 public static Coin getInstance () {12 return instance; 13} 14 15 public int getCoin () {16 return coin; 17} 18 19 public void addMoreCoin () {20 coin + = ADD_MORE_COIN; 21} 22 23 public void deductCoin () {24 coin--; 25} 26}

Реализация Kotlin

Ключевое слово объекта Kotlin объявляет одноэлементный класс

1 объект Coin {2 private var coin: Int = 0 3 4 fun getCoin (): Int {5 return coin 6 } 7 8 fun addCoin () {9 coin + = 10 10} 11 12 fun deductCoin () {13 coin - 14} 15}

Реализация Delphi и Free Pascal

GetInstance - поточно-безопасная реализация Синглтон.

unit SingletonPattern; тип интерфейса TTest = класс запечатанный строгий частный FCreationTime: TDateTime; публичный конструктор Create; свойство CreationTime: TDateTime читать FCreationTime; конец; функция GetInstance: TTest; реализация использует SysUtils, SyncObjs; var FCriticalSection: TCriticalSection; FInstance: TTest; функция GetInstance: TTest; begin FCriticalSection.Acquire; попробуйте, если не назначено (FInstance), то FInstance: = TTest.Create; Результат: = FInstance; наконец FCriticalSection.Release; конец; конец; конструктор TTest.Create; begin унаследовано Create; FCreationTime: = Сейчас; конец; инициализация FCriticalSection: = TCriticalSection.Create; доработка FreeAndNil (FCriticalSection); конец.

Использование:

процедура TForm3.btnCreateInstanceClick (Отправитель: TObject); var i: целое число; begin for i: = от 0 до 5 do ShowMessage (DateTimeToStr (GetInstance.CreationTime)); конец;
Примечания
Ссылки
Внешние ссылки
В Викибуке Информатика / Паттерны дизайна есть страница по теме: Синглтон реализации на разных языках
Викискладе есть носители, связанные с шаблоном Singleton.
Последняя правка сделана 2021-06-08 02:46:58
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте