Доброго дня, Шановні javarush-евці! У міру вивчення java, все частіше і частіше почав стикатися з таким поняттям, як патерни (або шаблони) проектування, але на просторах інтернету дуже мало інформації на цю тему для програмістів-початківців. Простіше кажучи – чайників (ким я і є). Я вирішив приділити трохи часу і постаратися розповісти про деякі з них якнайпростіше. Вони ж зустрічаються нам у міру просування на курсі javarush:
- Singleton / Одинак
- Wpapper / Decorator / Обгортка
- Adapter / Адаптер
- Стратегія / Стратегія
- Ведення логів Об'єкт, який відповідає за запис логів. Нам необхідний лише один екземпляр, оскільки потрібно писати лог, використовуючи той самий файл.
- Зберігання налаштувань Об'єкт з налаштуваннями потрібен лише один, тому що для всієї програми налаштування одні й ті самі.
- Створюємо єдиний екземпляр деякого типу
- Надаємо до нього доступ ззовні
- Забороняємо створення кількох примірників того ж типу
- З лінивою ініціалізацією*, не синхронізований
- Синхронізований
public class NonSynchronizedSingleton { private static NonSynchronizedSingleton instance; private NonSynchronizedSingleton(){} public static NonSynchronizedSingleton getInstance(){ if(instance == null) instance = new NonSynchronizedSingleton(); return instance; } }
Робимо приватним наш інстанс(об'єкт) класу, щоб заборонити безпосередньо до нього звертатися. робимо private static NonSynchronizedSingleton instance;
приватним конструктор, щоб наш синглтон і через конструктор було не створити. модифікатор доступу public - глобальний, тобто тепер ми з будь-якого місця можемо скористатися нашим singleton. У цьому вся методі ми запитуємо об'єкт даного класу - якщо об'єкта ще немає, створюємо його, якщо він є, отримуємо його ж . Звертаємось до нашого об'єкту ми таким чином private NonSynchronizedSingleton(){}
public static NonSynchronizedSingleton getInstance()
NonSynchronizedSingleton.getInstance()
Плюси/мінуси: Даний варіант реалізації хороший всім, крім того, що він не працює в багатопотоковому середовищі, а тому підходить виключно для однопотокових додатків. Чому? Тому що кілька ниток можуть одночасно створити об'єкти цього класу. 2. Синхронізований public class SynchronizedSingleton { private static SynchronizedSingleton instance = new SynchronizedSingleton(); private SynchronizedSingleton(){} public static SynchronizedSingleton getInstance(){ return instance; } }
Опис: Створюємо змінну private static SynchronizedSingleton instance = new SynchronizedSingleton();
Але робимо її приватною, щоб ніхто до неї безпосередньо не міг звернутися. Конструктор теж приватний private SynchronizedSingleton(){}
Ну і для роботи з об'єктом створюємо метод (гетер), який повертає нам наш об'єкт public static SynchronizedSingleton getInstance(){
Плюси: Проблему багатопоточності ми вирішабо, оскільки static змінна ініціалізується відразу ж під час ініціалізації класу, і скільки б ниток одночасно не звернулися, отримають завжди один і той самий об'єкт. Мінуси: Тепер у нас немає відкладеної ініціалізації (Об'єкт instance буде створений classloader під час ініціалізації класу) Підсумок: public class Test { public static void main(String[] args) { NonSynchronizedSingleton nonSynchronizedSingleton = NonSynchronizedSingleton.getInstance(); NonSynchronizedSingleton secondNonSynchronizedSingleton = NonSynchronizedSingleton.getInstance(); SynchronizedSingleton synchronizedSingleton = SynchronizedSingleton.getInstance(); SynchronizedSingleton secondSynchronizedSingleton = SynchronizedSingleton.getInstance(); System.out.println(nonSynchronizedSingleton.hashCode()); System.out.println(secondNonSynchronizedSingleton.hashCode()); System.out.println(nonSynchronizedSingleton.equals(secondNonSynchronizedSingleton)); System.out.println(synchronizedSingleton.hashCode()); System.out.println(secondSynchronizedSingleton.hashCode()); System.out.println(synchronizedSingleton.equals(secondSynchronizedSingleton)); Car car1 = new Car(); Car car2 = new Car(); System.out.println(car1.hashCode()); System.out.println(car2.hashCode()); System.out.println(car1.equals(car2)); } public static class Car {} }
Намагаємося створити більше одного об'єкта в кожній реалізації, але на виході отримуємо один і той же об'єкт: хешкоди рівні, equals повертає true. Для прикладу створив клас public static class Car {}
І порівняв хешкоди, equals двох об'єктів даного класу (вже не singleton) - хешкоди різні, equals повертає false 1956725890 1956725890 true 356573597 356573597 true 1735600054 21685669 false
Плюси: //TODO Мінуси: //TODO Wpapper / Decorator / Обгортка Опис: //TODO Що таке Навіщо потрібно Приклади Порядок дій: //TODO Код: //TODO Плюси: //TODO Мінуси: //TODO Adapter / Адаптер Опис: //TODO Що таке Навіщо потрібно Приклади Порядок дій: //TODO Код: //TODO Плюси: //TODO Мінуси: //TODO Strategy / Стратегія Опис: //TODO Що таке Навіщо потрібен Приклади Порядок дій: //TODO Код: //TODO Плюси: //TODO Мінуси: //TODO Під час вивчення тем використовував
- http://www.programcreek.com/java-design-patterns-in-stories/
- http://habrahabr.ru/post/103681/
- http://habrahabr.ru/post/116577/
- http://habrahabr.ru/post/129494/
- http://cpp-reference.ru/patterns/catalog/
- https://ua.wikipedia.org/wiki/%D0%9E%D1%82%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%BD%D0%B0%D1 %8F_%D0%B8%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8 %D1%8F
- http://habrahabr.ru/post/27108/
- http://www.amse.ru/courses/cpp1/2010.03.05.html
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ