Latest web development tutorials

Singleton Pattern

Синглтон (Singleton Pattern) Java является одним из самых простых шаблон дизайна. Этот тип шаблонов проектирования принадлежат создать схему, которая обеспечивает лучший способ для создания объектов.

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

Примечание:

  • 1, одноэлементный класс может иметь только один экземпляр.
  • 2, одноэлементный класс должен создать свой собственный уникальный экземпляр.
  • 3, одноэлементный класс должен обеспечить этот пример для всех остальных объектов.

введение

Цель: обеспечить , чтобы только один экземпляр класса, а также обеспечить глобальную точку доступа для доступа к нему.

Основное решение: использовать глобальный класс часто создается и уничтожается.

Когда использовать: Если вы хотите , чтобы контролировать количество случаев , когда, в целях экономии системных ресурсов.

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

Код ключа: конструктор является частным.

Примеры применения: 1, партия может быть только один президент.2, Windows, является мульти-процесс, многопоточный, в работе файла, когда он неизбежно несколько процессов или потоков одновременно документа явления, обработка всех файлов должны быть выполнены с помощью уникального экземпляра. 3, некоторые из менеджера оборудование часто разработан как с одинарным корпусом модели, такой как компьютер с двумя принтерами в выходном сигнале, когда это необходимо, чтобы иметь дело с двумя принтерами не может печатать один и тот же файл.

Преимущества: 1, только один экземпляр в памяти, уменьшая накладные расходы памяти, особенно часто создавать и уничтожать экземпляры (например, школа страницы кэша управления Home).2, чтобы избежать многократного загруженность ресурсов (например, операций записи файлов).

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

Сценарии использования: 1, требуется получение уникального серийного номера.2, счетчики, не каждая база данных в Риге один раз с одного случая, чтобы обновить кэшируются. 3, объект, созданный на необходимость чрезмерного потребления ресурсов, таких как подключение ввода / вывода в базу данных и так далее.

Примечание: деЫпзЬапсе () метод требует использования синхронизации блокировки синхронизированным (Singleton.class) для предотвращения нескольких потоков в экземпляр класса причина инстанцирован несколько раз.

реализация

Мы создадим классSingleObject.SingleObject класс имеет свой собственный конструктор и статический экземпляр.

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

Singleton модели UML диаграмма

Шаг 1

Создайте класс Singleton.

SingleObject.java

Открытый класс SingleObject {

   // Создание объекта SingleObject частный статический экземпляр SingleObject = новый SingleObject ();

   // Сделать конструктор Private, так что класс не будут создаваться частный SingleObject () {}

   // Получить единственный объект общественного доступного статического SingleObject GetInstance () {
      возвращать экземпляр;
   }

   общественного недействительными ShowMessage () {
      System.out.println ( "Hello World!");
   }
}

Шаг 2

Получите уникальный объект из одного класса путем.

SingletonPatternDemo.java

Открытый класс SingletonPatternDemo {
   государственной статической силы основных (String []) {агдз

      // Конструктор // нелегальный ошибка во время компиляции: Конструктор SingleObject () не виден // SingleObject объект = новый SingleObject ();

      // Получить единственный объект, объект доступен SingleObject = SingleObject.getInstance ();

      // Выводим сообщение object.showMessage ();
   }
}

Шаг 3

Проверьте выход.

Привет мир!

Несколько реализация шаблона Singleton

Реализация Singleton рисунка на целый ряд способов, следующим образом:

1, ленивый стиль, поточно-

Ленивые инициализации: Да

Есть несколько поточно: Нет

Достижение Уровень сложности:Легкий

Описание: Этот метод является самым основным способом для достижения этой реализации самая большая проблема не поддерживает многопоточность.Потому что нет блокировки синхронизированы, поэтому строгом смысле это не является одноточечным.
Ленивый нагрузки таким образом, очевидно, не требует безопасности потоков, работа в многопоточном не работает.

Примеры кода:

Открытый класс Singleton {  
    частный статический экземпляр Синглтон;  
    частная Синглтон () {}  
  
    общественности статической Singleton деЫпзЬапсе () {  
    если (экземпляр == NULL) {  
        экземпляр = новый Синглтон ();  
    }  
    возвращать экземпляр;  
    }  
}  

Следующая презентация нескольких реализаций поддерживают несколько потоков, но различаются по производительности.

2, ленивый стиль, поточно-

Ленивые инициализации: Да

Являются ли Многопоточной сейф:Да

Достижение Уровень сложности:Легкий

Описание: таким образом , имеют хорошую отложенной загрузки, может хорошо работать в многопоточной, однако, очень низкий коэффициент полезного действия , 99% случаев не требует синхронизации.
Преимущество: Первый вызов был инициализирован, чтобы избежать потери памяти.
Минусы: должны быть блокированы синхронизированы для обеспечения одного случая, но блокировка будет влиять на эффективность.
деЫпзЬапсе () производительность приложения не имеет решающего значения (которые используются реже).

Примеры кода:

Открытый класс Singleton {  
    частный статический экземпляр Синглтон;  
    частная Синглтон () {}  
    общественности статической синхронизированы Синглтон деЫпзЬапсе () {  
    если (экземпляр == NULL) {  
        экземпляр = новый Синглтон ();  
    }  
    возвращать экземпляр;  
    }  
} 

3, голодали формула

Ленивы Инициализация: Нет

Являются ли Многопоточной сейф:Да

Достижение Уровень сложности:Легкий

Описание: Это более распространенным, но склонны к объектам мусора.
Преимущества: не заблокирован, то эффективность повышается.
Недостатки: загрузчик класса инициализируется, память расходуется впустую.
Он основан на механизме classloder избегает синхронизации многопоточность, однако, случай, когда его экземпляра загрузчик классов, хотя класс причиной загрузки различных причин, большинство из шаблона Singleton является вызов метода GetInstance, но она не может быть определена есть и другие способы (или другие статические методы) приводит к классу нагрузки, на этот раз, видимо, не достигающие инициализации экземпляра отложенной загрузки эффект.

Примеры кода:

Открытый класс Singleton {  
    частных статических Singleton экземпляр = новый Синглтон ();  
    частная Синглтон () {}  
    общественности статической Singleton деЫпзЬапсе () {  
    возвращать экземпляр;  
    }  
}  

4, перепроверить блокировка / двойная блокировка проверка (DCL, то есть блокировка с двойной проверкой)

версия JDK: JDK1.5 из

Ленивые инициализации: Да

Являются ли Многопоточной сейф:Да

Осознайте сложность: более сложной

Описание: Этот метод использует двойной механизм блокировки, безопасность и, в случае многопоточности для поддержания высокой производительности.
деЫпзЬапсе () производительность приложений имеет решающее значение.

Примеры кода:

Открытый класс Singleton {  
    частная летучим статическая Singleton синглетон;  
    частная Синглтон () {}  
    общественности статической Singleton getSingleton () {  
    если (Singleton == NULL) {  
        синхронизирована (Singleton.class) {  
        если (Singleton == NULL) {  
            синглетон = новый Синглтон ();  
        }  
        }  
    }  
    вернуть одноэлементный;  
    }  
}  

5, тип регистрации / статические внутренние классы

Ленивые инициализации: Да

Являются ли Многопоточной сейф:Да

Реализовать трудности: Общие

Описание: Этот метод может достичь режима блокировки двойной проверки такой же эффект, но реализация проще.Используйте ленивая инициализация статического поля следует использовать таким образом, вместо двойной проверки режима блокировки. Это относится только к случаю статического поля, перепроверить режим блокировки может быть использован при необходимости задержки для инициализации полей экземпляра.
Этот подход также использует механизмы classloder, чтобы гарантировать, что только один поток инициализации экземпляра, то с 3-мя различными способами является: до тех пор, как третий путь загружен класс Singleton, экземпляр обрабатывается (не достиг отложенной загрузки эффект), но такой подход является класс Singleton загружен, экземпляр не может быть инициализирована. Поскольку класс SingletonHolder не активно используется, отображается только через вызов метода GetInstance, появляется загружен класс SingletonHolder, который конкретизируется экземпляр. Представьте себе, если вы реализуете экземпляр ресурсоемким, поэтому он хотел, чтобы задержать загрузку, с другой стороны, когда вы не хотите, чтобы создать экземпляр класса Singleton загрузчик, поскольку он не может обеспечить Singleton класс может также быть активным в других областях, с тем, чтобы быть загружен, на этот раз, чтобы создать экземпляр экземпляр явно неуместными. На этот раз, таким образом, по сравнению с первыми тремя видами способов это очень разумно.

Примеры кода:

Открытый класс Singleton {  
    частный статический класс SingletonHolder {  
    частных статических Singleton окончательный INSTANCE = новый Синглтон ();  
    }  
    частная Синглтон () {}  
    общественности статической окончательным Singleton деЫпзЬапсе () {  
    вернуть SingletonHolder.INSTANCE;  
    }  
}   

6, перечислить

версия JDK: JDK1.5 из

Ленивы Инициализация: Нет

Являются ли Многопоточной сейф:Да

Достижение Уровень сложности:Легкий

Описание: Эта реализация еще не получила широкого распространения, но это лучший способ осуществить одноэлементный шаблон.Это более кратким, автоматический механизм поддержки сериализации для предотвращения нескольких экземпляров абсолютной.
Этот подход эффективен Java автор Джош Блох выступает за способ, которым он может не только избежать проблем синхронизации многопоточных, но и автоматически поддерживает механизм сериализации для предотвращения десериализации повторно создать новый объект, абсолютно предотвратить многократное создание экземпляров. Однако, так как только после того, как присоединился к свойствам перечисляемых JDK1.5, писать таким образом, не может помочь, но чувствовать себя странно, на практике используется редко.
Не путем отражения атаки вызвать частный конструктор.

Примеры кода:

публичное перечисление Singleton {  
    INSTANCE;  
    общественного недействительными whateverMethod () {  
    }  
}  

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