Анализ схемы дизайна простых экземпляров Singleton
Предисловие
Сегодня я дам вам всеобъемлющее резюме наиболее часто используемого шаблона дизайна в разработке Android - режима Singleton.
Что касается введения в шаблоны дизайна, вы можете прочитать то, что я написал раньше: 1 минута, чтобы полностью понять «шаблоны дизайна»
Оглавление
1. Представьте
1.1 Какие проблемы решены
Как упоминалось ранее, дизайн шаблона = решение определенного типа конкретной проблемы, так что какая проблема с шаблоном синглтона ?
Значение: singleton = экземпляр;
Проблема решена: уменьшить связь между объектами
Решение: Singleton Pattern, то есть реализация того, что у класса есть только один экземплярный объект и обеспечивает глобальную точку доступа
1.2 Введение экземпляра
Далее я использую экземпляр, чтобы представить синглтон
Фон: Xioacheng имеет фабрику пластмасс, но внутри есть только один склад.
Цель: я хочу использовать код для внедрения управления складами
Текущая практика: установить склады и работники
Среди них количество в классе склада = количество товаров; Рабочие имеют методы обработки перемещения (int i) и перемещение (int i).
Проблемы: Благодаря тестированию было обнаружено, что каждый раз, когда переезжает работник, будет построен новый склад, то есть товары не помещаются на тот же склад. Что происходит? (См. Код ниже)
пакет scut.designmodel.singletonpattern; // Склад класса класса storehouse {private int cumber = 100; public void setquantity (int количество) {this.quantity = количество; } public int getQuantity () {return Количество; }} // Ходячие человеческое класс -перевозчик {public Storehouse MSTOREHOUSE; Public Carrier (Storehouse Storehouse) {MSTOREHOUSE = Storehouse; } // Перемещение товаров в склад Public void Movein (int i) {mShoreHouse.SetQuantity (mShoreHouse.getQuantity ()+i); } // Выходить из склада Public void Moveout (int i) {mShoreHouse.SetQuantity (mShoreHouse.getQuantity ()-i); }} // Обработка работников Тест общедоступного класса SinglePattern {public static void main (string [] args) {storehouse mstorehouse1 = new Storehouse (); Storehouse MSTOREHOUSE2 = New Storehouse (); Носитель Carrier1 = новый перевозчик (MSTOREHOUSE1); Carrier Carrier2 = новый перевозчик (MSTOREHOUSE2); System.out.println («Два одинаково?»); if (mStoreHouse1.equals (MSTOREHOUSE2)) {// Использование здесь равно, а не символ ==, потому что символ == - просто для сравнения адресов двух объектов System.out.println (" - это то же самое"); } else {System.out.println ("не то же самое"); } // После того, как носильщик перемещает товары, сообщите о количестве товаров на складе Carrier1.movein (30); System.out.println ("Маргина продукта склада:"+carrier1.mstorehouse.getquantity ()); Carrier2.moveout (50); System.out.println ("Маргина продукта склада:"+carrier2.mstorehouse.getquantity ()); }}результат:
Два одинаковых? Маржа продукта на том же складе: 130 Склад Маржа продукта: 50
2. Введение в синглтонский рисунок
2.1 Решенные проблемы (сценарии приложения)
Конфликт: из приведенных выше результатов видно, что работники работали, очевидно, не тот же экземпляр склада.
Цель: все работники управляют одним и тем же экземпляром склада
Синглтонский шаблон является решением этой проблемы: внедрить класс только с одним созданным объектом и обеспечивает глобальный принцип работы с точкой доступа 2.2
В Java мы управляем этими классами, используя объекты (после класса экземпляра). Классовая экземпляра выполняется через его конструктор . Если мы хотим реализовать, что у класса есть только один созданный объект, мы должны работать над конструктором класса:
Общая реализация режима синглтона: (включая шаги использования)
открытый класс Singleton {// 1. Создайте частную переменную OreinStance (используется для записи уникального экземпляра Singleton) // 2. Создание внутреннего частного статического Singleton ourinstance = new Singleton (); // 3. Приватизировать конструктор класса и предотвратить внешние вызовы для создания частного singleton () {} // 4. Определите публичный метод для обеспечения глобальной уникальной точки доступа для класса // 5. Внешне вернуть уникальный экземпляр, вызывая метод getInstance () public static singleton newinstance () {return ourintance; }}Хорошо, вы должны понять введение и принципы синглтонского рисунка, верно? Итак, давайте решим проблему, что «склад не тот же», который появился выше Сяочэн!
2.3 Пример введения
Xiaocheng использует режим Singleton для улучшения кода для приведенного выше примера:
пакет scut.designmodel.singletonpattern; import java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; // Singleton Warehouse Classhouse storehouse {// Количество складских продуктов частное количество int = 100; // создание частного статического хранилища yourinstance = new Storehouse () ;; // Пусть внешний вызов метод getInstance () для возврата уникального экземпляра. public Static Storehouse getInstance () {return yourInstance; } // Закрытый конструктор private storehouse () {} public void setquantity (int Количество) {this.quantity = количество; } public int getQuantity () {return Количество; }} // Carrier Man Class Carrier {public Storehouse MSTOREHOUSE; Public Carrier (Storehouse Storehouse) {MSTOREHOUSE = Storehouse; } // Перемещать товары в склад Public void MoveIn (int i) {mShoreHouse.SetQuantity (mShoreHouse.getQuantity ()+i); } // Выходить из склада Public void Moveout (int i) {mShoreHouse.SetQuantity (mShoreHouse.getQuantity ()-i); }} // Тест рабочих работников общедоступный класс SinglePattern {public static void main (string [] args) {storehouse mShoreHouse1 = stase.getInstance (); Storehouse mShoreHouse2 = storehouse.getInstance (); Носитель Carrier1 = новый перевозчик (MSTOREHOUSE1); Carrier Carrier2 = новый перевозчик (MSTOREHOUSE2); System.out.println («Два одинаково?»); if (mStoreHouse1.equals (mStoreHouse2)) {System.out.println ("это то же самое"); } else {System.out.println ("не то же самое"); } // После того, как носильщик перемещает товары, сообщите о количестве товаров на складе, Carrier1.Movein (30); System.out.println ("Маргина продукта склада:"+carrier1.mstorehouse.getquantity ()); Carrier2.moveout (50); System.out.println ("Маргина продукта склада:"+carrier2.mstorehouse.getquantity ()); }}результат:
Два одинаковых? Это та же самая складская товарная маржа: 130 складской товарной маржа: 80
Согласно анализу результатов, после использования модели Singleton в классе склада есть только один экземпляр склада, и нет необходимости беспокоиться о том, чтобы носильщики входили в неправильный склад! ! !
2.4 Преимущества
2.5 Недостатки
3. Реализация режима синглтона
3.1 Общая ситуация
Голодный стиль (самый простой метод реализации Синглтона)
Класс Singleton {Private Static Singleton ourinstance = new Singleton (); private singleton () {} public static singleton newinstance () {return yourintance; }}Сценарии приложения:
Ленивый стиль
Самая большая разница между ленивым и голодным - это время операции инициализации синглтонов :
Класс Singleton {Private Static Singleton ourinstance = null; private singleton () {} public static singleton newinstance () {if (yourinstance == null) {werinstance = new singleton (); } вернуть yourInstance; }}Сценарии приложения:
3.2 Реализация режима синглтона в рамках многопоточной чтения
В случае многопоточного чтения:
Решение 1: синхронизировать блокировку
Используйте синхронизацию блокировки, синхронизированный (singleton.class), чтобы предотвратить въезд нескольких потоков одновременно, что приводит к тому, что экземпляр будет создан несколько раз.
Класс Singleton {Private Static Singleton ourinstance = null; private singleton () {} public static singleton newinstance () {synchronized (singleton.class) {if (yourinstance == null) {yourinstance = new singleton (); }} вернуть yourInstance; }}Решение 2: блокировка с двойной проверкой
Слой IF добавляется на основе блокировки синхронизации (за исключением синхронизированного (singleton.class)), чтобы улучшить производительность после экземпляра экземпляра, и в следующий раз, когда он входит, он не должен выполнять синхронизированный (singleton.class), чтобы получить блокировку объекта, тем самым повышая производительность.
Класс Singleton {Private Static Singleton ourinstance = null; private singleton () {} public static singleton newinstance () {if (yourinstance == null) {synchronized (singleton.class) {if (yourinstance == null) {yourinstance = new singleton (); }}} вернуть ourInstance; }}Решение 3: статический внутренний класс
Когда класс JVM загружается, данные гарантированно будут синхронизированы. Мы используем внутреннюю реализацию класса: создавать экземпляры объектов во внутреннем классе.
Пока приложение не использует внутренний класс JVM, класс Singleton не будет загружен, а объект Singleton не будет создан, тем самым достигая «ленивой» ленивой загрузки и безопасности потока.
Class Singleton {// Объект Singleton будет создан только тогда, когда внутренний класс загружен частным статическим классом Singleton2 {Private Static Singleton ourinstance = new Singleton (); } private singleton () {} public static singleton newinstance () {return singleton2.ourinstance; }}Решение 4: перечисленные типы
Самый простой и простой в использовании метод реализации синглтона (рекомендуется «Эффективной Java»)
public enum singleton {// определить элемент перечисления, который является экземпляром экземпляра Singleton; public void dosomething () {}}Как использовать его следующим образом:
Singleton singleton = singleton.instance; singleton.dosomething ();
5. Резюме
Эта статья в основном представляет модель Синглтона, включая принципы и методы реализации. Далее я буду продолжать объяснять другие модели дизайна. Если вы заинтересованы, вы можете продолжать обращать на это внимание.
Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!