ЛАБОРАТОРНА РОБОТА №2 ПАТЕРН ПРОГРАМУВАННЯ "ОДИНАК" Мета:вивчення патерну програмування «одинак» та його доцільного використання. Порівняння однакового програмного коду з використанням патерну «одинак» та без нього.
Хід роботи: Завдання. Створити клас Saver, в якому буде реалізоване збереження усіх потрібних робочих матриць з попередньої лабораторної роботи, а також їх читання за визначеним номером. Клас має бути реалізований з дотриманням патерну програмування «Одинак». Методи класу:
відкрити або створити вказаний файл для запису\читання матриць;
записати матрицю в першу знайдену достатню за розміром вільну частину файлу
прочитати матрицю з заданим номером з файлу в пам'ять;
замінити записану матрицю у файлі на іншу, якщо розмір нової матриці більший, записати її в кінець файлу;
видалити матрицю;
видалити з файлу пусті місця (дефрагментація;
записати матрицю;
очистити файл матриць;
та інші методи за бажанням.
Використовуючи клас "Матриця" з попередньої лабораторної роботи:
згенерувати 5 матриць розміром 20на 20;
записати їх у файл;
порахувати їх визначники для кожної;
отримані значення визначників записати також в файл до матриць;
Перемножити усі п'ять матриць, записуючи в файл результати множення з накопиченям (Матриця1 *Матриця 2 (запис) *Матриця3 (запис).......);
Обрахувати обернену матрицю матриці, яка є добутком усіх пяти матриць.
Замінити у файлі усі пять початкових матриць на нові розміром 10 на 10;
Порахувати добунок пяти нових матриць;
матрицю-добуток записти в файл;
Дефрагментувати файл;
Вивести кількість матриць у файлі (данні з класу Saver).
Одинак (Singleton, Сінглтон) - породжує патерн, який гарантує, що для певного класу буде створений тільки один об'єкт, а також надасть до цього об'єкта точку доступу. Якщо об'єкт не потрібен, то не буде створено. У цьому відмінність Сінглтона від глобальних змінних
Клас Saver був реалізований з дотриманням патерну «Одинак» (який має лише один екземпляр класу, та надає глобальну точку доступу до нього).
Також в заданому класі було створено n-кількість методів.
Нижче метод OpenFile() перевіряє чи існує заданий файл (якщо існує, то закриває його), далі операційна система відкриває файл (якщо той існує), або створює новий.
Бінарна серіалізація і десеріалізація.
Дуже важливий етап цієї лабораторної роботи, тому що завдяки цьому я працював з бінарним файлом.
Серіалізація - це переведення даних у послідовність байтів, а десеріалізація - навпаки. Для бінарної серіалізації і десеріалізації я використовував BinaryFormatter.CS
Трішки нижче наведений код методу, який серіалізує заданий список у файл. В методі ми спочаку відкриваємо потік, в якому будемо зберігати дані, а далі створюємо об’єкт BinaryFormatter і успішно серіалізуємо список.
Якщо вже я розпочав розписувати серіалізацію, то потрібно не забути і про десеріалізацію. Фрагмент коду в моїй програмі:
Принцип роботи аналогічний з розписування трішки вище, але при десеріалізації ми повинні перетворити об’єкт до типу Matrix-(List)bf.Deserialize(sw).
За допомогою методу WriteMatrix ми додаємо обрану матрицю до списку і серіалізуємо (зберігаємо) список у файл.
Далі прочитуємо матрицю з заданим номером з файлу в пам'ять.
Метод Replace замінює записану матрицю у файлі на іншу, якщо розмір нової матриці більший, а якщо ні, то записує її в кінець файлу.
Метод DeleteMatrix видаляє матрицю за її номером. Десеріалізований файл ми присвоюємо списку, і видаляємо зі списку матрицю з вказаним номером, а далі серіалізуємо оновлений список у файл.
Результат виконання програми:
Рисунок 1. Виведення матриць №0-1.
Рисунок 2. Виведення матриць №2-3.
Рисунок 3. Виведення матриці №4.
Рисунок 4. Обрахування визначників матриці.
Рисунок 5. Добуток матриць.
Рисунок 5.1. Добуток матриць.
Рисунок 6. Обернена матриця.
Рисунок 7. Заміна матриць.
Рисунок 7.1. Заміна матриць.
Рисунок 8. Добуток пяти матриць.
Рисунок 9. Кількість матриць у файлі.
Висновки: в ході виконання лабораторної роботи був вивчений патерн програмування «одинак» та отримані навички в його доцільному використанні. На мою думку, порівняняно однаковий програмний код з використанням патерну «одинак» та без нього.