В разработке программного обеспечения, Одноэлементный шаблон - это шаблон разработки программного обеспечения, который ограничивает создание класса класса одним «единственным» экземпляром. Это полезно, когда для координации действий в системе требуется ровно один объект. Термин происходит от математической концепции синглтона ..
Критики считают, что синглтон является анти-шаблоном в том смысле, что он часто используется в сценариях, где это нецелесообразно, вводит ненужные ограничения в ситуации, когда единственный экземпляр класса фактически не требуется и вводит глобальное состояние в приложение.
Одноэлементный шаблон проектирования - один из двадцати трех хорошо известных " Шаблоны проектирования «Банда четырех», которые описывают, как решать повторяющиеся проблемы проектирования для разработки гибкого и многоразового объектно-ориентированного программного обеспечения, т. То есть объекты, которые легче реализовать, изменить, протестировать и повторно использовать.
Шаблон проектирования singleton решает такие проблемы, как:
Одноэлементный дизайн pattern описывает, как решить такие проблемы:
getInstance ()
), которая возвращает единственный экземпляр класса.Ключевая идея в этом шаблоне состоит в том, чтобы сделать сам класс ответственным за управление его экземпляром (что он создается только один раз).. Скрытый конструктор (объявленный частным) гарантирует, что класс никогда не может быть создан извне класса.. Доступ к общедоступной статической операции можно легко получить, используя имя класса и имя операции (Singleton.getInstance ()
).
Реализация одноэлементного шаблона должна:
Как правило, это делается путем:
Экземпляр обычно хранится как частная статическая переменная ; экземпляр создается при инициализации переменной, в какой-то момент до первого вызова статического метода. Ниже приведен пример реализации, написанной на Java.
public final class Singleton {private static final Singleton INSTANCE = new Singleton (); частный синглтон () {} общедоступный статический синглтон getInstance () {return INSTANCE; }}
class Singleton (object): __instance = None def __new __ (cls, * args): if cls.__ instance is None: cls.__ instance = object.__ new __ (cls, * args) return cls.__ экземпляр
общедоступный запечатанный класс Singleton {общедоступный статический экземпляр Singleton {get; } = новый синглтон (); private Singleton () {}}
В C # вы также можете использовать статические классы для создания синглтонов, где сам класс является синглтоном.
общедоступный статический класс Singleton {общедоступный статический экземпляр MyOtherClass {получить; } = новый MyOtherClass (); }
Синглтоны могут быть полезным инструментом при разработке с 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 (); }}} возвращаемый экземпляр; }}
1 класс Singleton {2 3 static Singleton _instance; 4 5 статических синглтонов получить экземпляр =>_ экземпляр ?? Синглтон._ (); 6 7 Синглтон._ () =>_ instance = this; 8}
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}
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 объявляет одноэлементный класс
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}
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. |