Модель Singleton является самой простой моделью дизайна среди 23 моделей дизайна, а также широко используется в разработке предприятий. Преимущество синглтонского рисунка заключается в том, что в проекте есть только один экземпляр.
Особенности: конструктор приватизирован, объект приватизирован и предоставляет только интерфейс внешнего доступа.
Сценарии приложения:
1. Система должна делиться ресурсами: например, система журнала, Spring Resource Manager и т. Д.
2. Чтобы контролировать использование ресурсов: например, пул потоков
Общие приложения в разработке на уровне предприятия и общих структурах:
Сервлеты в J2EE, менеджеры ресурсов весной (то есть бобы), пулы подключений к базе данных, пулы потоков, системы журналов, счетчики веб -сайтов и т. Д.
Классификация шаблонов Singleton:
1. Голодный режим: Голодный режим является самым простым режимом синглтона для кода, но экземпляр загружается при инициализировании класса. Если он не используется мгновенно, система будет загружена. Конкретный код заключается в следующем:
Public Class Singleton {Private Static Singleton Extance = new Singleton (); private singleton () {} public static singleton getInstance () {return ancess; }}2. Ленивый режим: по сравнению с голодным режимом, ленивый режим создается и помещается в единственный внешний интерфейс для процесса, который реализует отсроченную нагрузку, время инициализации системы сохранения системы, но существует ситуация, когда потоки небезопасны.
Public Class Singleton {Private Static Singleton Extance = null; private singleton () {} public static singleton getInstance () {if (exance == null) {return new singleton (); } return Encement; }}3. Двойная проверка блокировки: режим блокировки двойной проверки на самом деле является обновлением ленивого режима, что делает безопасную систему ленивого режима. Примечание. Существует проблема с памятью с двойной блокировкой проверки, которая может аннулировать блокировку двойной проверки.
Public Class Singleton {Private Static Singleton Extance = null; private singleton () {} public static singleton getInstance () {if (exance == null) {synchronized (singleton.class) {if (exant == null) {return new singleton (); }} return Encement; }}4. Статический внутренний режим класса: статический внутренний класс имеет как ленивые, так и злые режимы: безопасная потока, отсроченная нагрузка.
Public Class Singleton {Private Static Class SingletonFactory {Private Static Singleton Extance = new Singleton (); } private singleton () {} public static singleton getInstance () {return singletonfactory.instance; }}5. Режим перечисления класса: он должен быть наиболее совершенным режимом с одним интересом, который не только безопасен для потока, но и предотвращает проблемы с отказанием и отражением.
enum singleton {exants; public void dosomething () {...}}СДЕЛАННЫЙ ПРОБЛЕМЫ СДЕЛАТЬ СДЕЛАЧНЫЙ ПРОБЛЕМЫ:
1. Отражение разбивает режим синглтона: отражение может разрушить реализацию режима Синглтона (за исключением режима перечисления)
/***Уничтожить режим синглтона по отражению*/public class demo01 {public static void main (string [] args) бросает исключение {singleton s1 = singleton.getinstance (); Singleton s2 = singleton.getinstance (); System.out.println (S1 == S2); Класс <singleton> clazz = (class <singleton>) class.forname ("com.singleton.singleton"); Конструктор <ingleton> constructor = clazz.getDeclaredConstructor (null); Constructor.SetAccessible (true); Singleton S3 = Constructor.newinStance (); System.out.println (S1 == S3); }} class singleton {private static singleton ancess = new singleton (); private singleton () {// метод предотвращения отражения от уничтожения режима с одним интересом, откройте раздел комментариев // if (exanter! = null) {// бросить новый runtimeexception (); //}} public static singleton getInstance () {return extment; }}Фактически, так называемая профилактика означает, что невозможным создавать с помощью размышлений.
2. десериализация нарушает шаблон синглтона (за исключением шаблона класса перечисления)
/*** Основная детериализация нарушает шаблон Singleton*/public Class demo02 {public static void main (string [] args) бросает исключение {singleton s1 = singleton.getinstance (); Singleton s2 = singleton.getinstance (); System.out.println (S1 == S2); FileOutputStream fos = new FileOutputStream ("d: //test.txt"); ObjectOutputStream oos = new ObjectOutputStream (FOS); OOS.WriteObject (S1); oos.close (); fos.close (); ObjectInputStream OIS = new ObjectInputStream (new FileInputStream ("d: //test.txt")); Singleton S3 = (Singleton) OIS.ReadObject (); System.out.println (S1 == S3); }} класс Singleton реализует serializable {private Static Singleton Encament = new Singleton (); public static singleton getInstance () {return ancess; } // Default Deserialization, если объект уже существует, этот метод будет вызван // частного объекта readresolve () throws objectStreamException {// return Encement; // //}}Эти две ситуации ограничены пониманием и мало используются в реальном процессе разработки.
На этом этапе, синглтонский рисунок завершен.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.