JavaRush /Java блог /Random UA /Шаблони проектування для чайників
mrserfr
33 рівень
Киев

Шаблони проектування для чайників

Стаття з групи Random UA
Шаблони проектування для чайників. Доброго дня, Шановні javarush-евці! У міру вивчення java, все частіше і частіше почав стикатися з таким поняттям, як патерни (або шаблони) проектування, але на просторах інтернету дуже мало інформації на цю тему для програмістів-початківців. Простіше кажучи – чайників (ким я і є). Я вирішив приділити трохи часу і постаратися розповісти про деякі з них якнайпростіше. Вони ж зустрічаються нам у міру просування на курсі javarush:
  • Singleton / Одинак
  • Wpapper / Decorator / Обгортка
  • Adapter / Адаптер
  • Стратегія / Стратегія
Хочеться заздалегідь сказати, що я міг у якомусь місці помаботися – будь ласка, поправляйте мене, я врахую та виправлю. Отже, поїхали... Про шаблони загалом //TODO Шаблони проектування для чайників. Singleton / Одинак ​​Що таке? Один з патернів, що породжує, який гарантує, що у класу є тільки один екземпляр + надає до нього глобальну точку доступу. Буває потокобезпечний (може працювати в багатопотоковій програмі) і ні, з простою та відкладеною ініціалізацією*. *Відкладена (лінива) ініціалізація (англ. Lazy initialization). Прийом у програмуванні, коли деяка ресурсомістка операція (створення об'єкта, обчислення значення) виконується безпосередньо перед тим, як буде використано її результат. Отже, ініціалізація виконується «на вимогу», а чи не заздалегідь. (wiki) Навіщо потрібен? Сінглтон потрібен, щоб точно знати, що у нас створено ОДИН об'єкт цього класу. Приклади:
  • Ведення логів
  • Об'єкт, який відповідає за запис логів. Нам необхідний лише один екземпляр, оскільки потрібно писати лог, використовуючи той самий файл.
  • Зберігання налаштувань
  • Об'єкт з налаштуваннями потрібен лише один, тому що для всієї програми налаштування одні й ті самі.
Порядок дій:
  1. Створюємо єдиний екземпляр деякого типу
  2. Надаємо до нього доступ ззовні
  3. Забороняємо створення кількох примірників того ж типу
Є кілька популярних реалізацій даного патерну, я розгляну тут два найпростіші :
  1. З лінивою ініціалізацією*, не синхронізований
  2. Синхронізований
1. З лінивою ініціалізацією, не синхронізований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
Авторам велике спасибі.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ