Определение: убедитесь, что класс имеет только один экземпляр, и создает его сам и предоставляет этот экземпляр всей системе.
Тип: Создать диаграмму класса класса класса:
Учетные знания с диаграммой:
1. Классовые диаграммы разделены на три части, имя, атрибуты и методы.
2. Информация о комментарии, начиная с << и заканчивая >>
3. Modifier + представляет публичный, - представляет собой частное, # представляет защиту, ничто не представляет видимую пакет.
4. Подчеркнутые атрибуты или методы представляют собой статические.
5. Друзья, которые не знакомы с отношениями между объектами на классной диаграмме, могут ссылаться на статью: отношения между классами в схеме проектирования.
Режим Синглтона должен быть самым простым режимом среди 23 режимов проектирования. У него есть следующие элементы:
Давайте посмотрим на простой пример:
пакет com.wolf.action; import java.util.hashmap; import java.util.map; демо открытого класса {public static void main (String args []) Throws InstantiationException, allodalaccessexception, classnotfoundexception {System.out.println (son.getNstance (). getName ();); System.out.println («Кто я»); }} класс Son расширяет отец {частная строка name = "son"; final String class = "demo"; Защищенная строка getName () {return this.query ("aaa"); } public static son getInstance () бросает instantiationException, allodalaccessexception, classnotfoundexception {// Это должен быть глобальный путь, в противном случае экземпляр вернуть (сын) ("com.wolf.action.son"); }} класс Отец {частная статическая карта <string, object> exaction = new hashmap <string, object> (); Private String name = "Premium Class"; Protected void fatcher () {System.out.println («Я - родительский класс»); } Защищенный строковый запрос (String SQL) {return SQL + "был сделан"; } public Static Extance (String objname) Throws instantiationException, allogalAccessexception, classnotfoundexception {if (exants.get (objname) == null ||! (ancess.get (objname) exanceof father)) {exants.put (objname, class.forname (objname). } return ancess.get (objname); }} Одиночный рисунок разделен на два типа в соответствии с временем создания объекта: один - голодный Синглтон, а другой - ленивый Синглтон. Когда класс Синглтона загружен, Синглтон создает объект с собственной ссылкой; Ленивый стиль создаст создание объекта только при вызове метода экземпляра. Код заключается в следующем:
Голодный мужчина в одиночном корпусе
открытый класс Singleton {Private Static Singleton Singleton = new Singleton (); private singleton () {} public static singleton getInstance () {return singleton; }}Ленивый единственный случай
открытый класс Singleton {Private Static Singleton Singleton; private singleton () {} public static synchronized singleton getInstance () {if (singleton == null) {singleton = new Singleton (); } вернуть Singleton; }}Преимущества режима синглтона:
Применимые сценарии: из -за вышеуказанных преимуществ в синглтонском режиме это режим проектирования, который чаще используется в программировании. Я суммировал то, что я знаю о подходящих сценариях для использования режима Singleton:
Примечания в режиме Синглтона:
Некоторые противоречия о синглтонском рисунке в Java:
Если объект в режиме Синглтона не используется в течение длительного времени, будет ли он собранным коллекционером мусора JVM? Я видел много информации, в которой говорилось: если объект Singleton не используется в памяти в течение долгого времени, он будет считаться мусором JVM и будет очищен при выполнении сбора мусора. Я скептически отношусь к этому утверждению. Мое собственное представление: В версии 1.6 Virtual Machine Virtual Machine Jvm Collector не будет перерабатывать объекты Singleton, если только соединение статически не ссылается на объекты Singleton в Синглтоне, искусственно отключено.
Что касается этого противоречия, автор написал отдельную статью, чтобы обсудить ее. Если у вас есть разные мнения или вы испытали это, введите в обсуждение модели «Модель Синглтона»: модель Синглтона и коллекция мусора участвуют в обсуждении.
Появятся ли несколько синглтонов в JVM
В случае распределенных систем, многочисленных классовых погрузчиков и сериализованных, будут созданы несколько синглетонов, что, несомненно, верно. Значит, будет ли сгенерировать синглтон в том же JVM? Только один и тот же Синглтон может быть получен с использованием метода GetInstance (), предоставленного Singleton, если не будет использован метод отражения, будет получен новый Singleton. Код выглядит следующим образом
Класс c = class.forname (singleton.class.getname ()); Конструктор ct = c.getdeclaredconstructor (); ct.setAccessible (true); Singleton singleton = (singleton) ct.newinstance ();
Таким образом, каждый запуск будет создавать новый объект Singleton. Поэтому при использовании режима Singleton будьте осторожны, чтобы не использовать отражение для генерации новых объектов Singleton.
Lazy Singleton Thread безопасен?
В основном некоторые онлайн-заявления, которые ленивый синглтонский шаблон не является теме. Даже добавление синхронизированного ключевого слова к методу экземпляра все еще опасно. Однако, после кодирования тестов, я обнаружил, что после добавления синхронизированного ключевого слова для его изменения, хотя оно оказывает частичное влияние на производительность, оно безопасно и не создает экземпляры нескольких объектов.
Есть ли только два типа синглтонских режимов: голодные и ленивые стили?
Hungry Singleton и Lazy Singleton - это всего лишь два относительно основных и обычно используемых методов синглтона. Теоретически, любой шаблон дизайна, который может реализовать только один экземпляр класса, может быть назван одним шаблоном.
Могут ли классы синглтона быть унаследованы?
Поскольку метод строительства является частным, они не являются наследственными, но могут быть унаследованы многие другие синглтонские модели, такие как зарегистрированные синглтоны.
Лучше быть голодным синглтоном или ленивым синглтоном
В Java голодный синглтон лучше, чем ленивый Синглтон. В C ++ обычно используются ленивые синглтоны.
Образец Singleton относительно прост, поэтому я не буду примером демонстрации кода здесь.