You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
:white_check_mark:__Преимущества паттерна Abstract Factory__: упрощение добавления новых продуктов, их сочетаемость, а также избавление кода от привязки к конкретным классам продуктов.<br>
186
+
:white_check_mark:__Преимущества паттерна Abstract Factory__: упрощение добавления новых продуктов, их сочетаемость, а также избавление кода от привязки к конкретным классам продуктов.<br>
187
187
:x:__Недостатки__: возможное усложнение кода из-за создания огромного количества вспомогательных классов.
188
188
____
189
189
### Одиночка
@@ -216,7 +216,7 @@ public class Section
216
216
:two: Создаем заблокированный объект, который мы будем использовать для синхронизации. Это означает, что в критическую область кода потоки будут заходить по очереди.<br>
217
217
:three: Создаем список разделов, в который мы будем добавлять созданные разделы.<br>
218
218
:four: Создаем защищенный конструктор. Это необходимо для того, чтобы у нас не было возможности вызвать публичный конструктор, так как в этом случае мы не сможем контролировать количество созданных экземпляров класса SectionDatabase.<br>
219
-
:five: Добавляем публичный метод __Initialize__. Его назначение - инициализировать объект базы данных, а также проверять: если объект базы данных уже был создан, то необходимо возврать уже ранее созданный экземпляр. Также не забываем про использование синхронизации для критической секции.<br><br>
219
+
:five: Добавляем публичный метод __Initialize__. Его назначение - инициализировать объект базы данных, а также проверять: если объект базы данных уже был создан, то необходимо возврать уже ранее созданный экземпляр. Также не забываем про использование синхронизации для критической секции.<br><br>
220
220
Теперь посмотрим на получившийся результат (код представлен в упрощенном виде, полная реализация доступна в репозитории):
221
221
```C#
222
222
/// <summary>
@@ -268,7 +268,7 @@ public class SectionDatabase
268
268
}
269
269
}
270
270
```
271
-
:white_check_mark:__Преимущества паттерна Singleton__: класс гарантированно имеет только один экземпляр и не более, у нас есть точка доступа к единственному экземпляру (в нашем случае это метод Initialize)<br>
271
+
:white_check_mark:__Преимущества паттерна Singleton__: класс гарантированно имеет только один экземпляр и не более, у нас есть точка доступа к единственному экземпляру (в нашем случае это метод Initialize).<br>
272
272
:x:__Недостатки__: нарушение принципа единой ответственности (Single Responsibility Principle), требуется особая обработка в многопоточной среде.
273
273
___
274
274
### Строитель
@@ -577,11 +577,132 @@ public class Customer : User
577
577
> Здесь у нас уже присутствует класс Passport - это ссылочный тип, соответсвенно, мы не можем использовать неполное копирование. Если мы будем использовать неполное копирование, то у нас будет два заказчика ссылаться на один и тот же объект паспортных данных. Поэтому нам придется создать новый объект паспорта и вручную его проинициализировать.
578
578
579
579
Также, чтобы убедиться в том, что у нас создаются два абсолютно разных объекта, которые не ссылаются на одни и те же поля, рекомендую запустить тесты в проекте PrototypeTests, где происходит данная проверка.<br><br>
580
-
:white_check_mark:__Преимущества паттерна Prototype__: клонирование объектов без привязки к конкретным классам, сокращение кода инициализации экземплятор классов<br>
580
+
:white_check_mark:__Преимущества паттерна Prototype__: клонирование объектов без привязки к конкретным классам, сокращение кода инициализации экземплятор классов.<br>
581
581
:x:__Недостатки__: Проблемы с клонированием составных объектов, то есть, тех объектов, которые внутри содержат другие объекты.
582
582
___
583
583
### Фабричный метод
584
-
__Фабричный метод (Factory Method)__ -
584
+
__Фабричный метод (Factory Method)__ - это порождающий паттерн проектирования, который определяет интерфейс для создания объектов определенного класса, но именно в подклассах принимается решение о типе объекта, который будет создан.<br>
585
+
> :white_check_mark: Фабричный метод будет полезен, если мы заранее не знаем, объекты каких типов мы хотим создать.
586
+
587
+
У нас есть следующие участники:
588
+
* базовый класс какого-либо продукта;
589
+
* наследники базового класса продукта;
590
+
* базовый класс создателя этого продукта;
591
+
* создатели-наследники базового класса создателя, которые созданию продукты-наследники базового класса продукта<br>
592
+
593
+
:one: Реализуем паттерн на примере создания телефонов. Пусть у нас будет базовый класс __Phone__, содержащий следующие свойства:
:four: Создадим разработчиков телефонов Нокиа и Самсунга, реализующих интерфейсы __IPhoneDeveloper__:
678
+
```C#
679
+
/// <summary>
680
+
/// Разработчик телефонов фирмы Нокиа.
681
+
/// </summary>
682
+
publicclassNokiaDeveloper : IPhoneDeveloper
683
+
{
684
+
/// <summary>
685
+
/// Создание телефона.
686
+
/// </summary>
687
+
/// <returns>Телефон.</returns>
688
+
publicPhoneCreatePhone() =>newNokia();
689
+
}
690
+
691
+
/// <summary>
692
+
/// Разработчик телефонов фирмы Самсунг.
693
+
/// </summary>
694
+
publicclassSamsungDeveloper
695
+
{
696
+
/// <summary>
697
+
/// Создание телефона.
698
+
/// </summary>
699
+
/// <returns>Телефон.</returns>
700
+
publicPhoneCreatePhone() =>newSamsung();
701
+
}
702
+
```
703
+
:white_check_mark:__Преимущества паттерна Factory Method__: упрощение поддержки кода, так как продукт создается в отдельном классе.<br>
704
+
:x:__Недостатки__: Значительное увеличение кода, так как для каждого класса продукта необходимо будет добавлять класс-создатель, который будет создавать данный продукт.
705
+
___
585
706
## Структурные паттерны
586
707
__Структурные паттерны__ (Structural) - цель их применения заключается в том, что благодаря им вы можете совмещать и сочетать сущности вместе.
__Итератор (Iterator)__ - это поведенческий паттерн проектирования, благодаря которому у нас есть возможность последовательно обходить элементы составных объектов, при этом не раскрывая их внутреннего представления.<br>
805
-
Идея паттерна в том, чтобы вынести поведение обхода коллекции из самой коллекции в __отдельный класс__.<br>
926
+
Идея паттерна в том, чтобы вынести поведение обхода коллекции из самой коллекции в __отдельный класс__.<br>
806
927
> :white_check_mark: Зная эту информацию, давайте теперь его реализуем.
807
928
808
929
Пусть у нас будет файловая система, которая будет хранить файлы. У каждого файла есть следующие свойства:
@@ -995,7 +1116,7 @@ public class FileSystemNumerator : IFileIterator
995
1116
}
996
1117
}
997
1118
```
998
-
:white_check_mark:__Преимущества паттерна Iterator__: достигается упрощение классов хранения данных<br>
1119
+
:white_check_mark:__Преимущества паттерна Iterator__: достигается упрощение классов хранения данных.<br>
999
1120
:x:__Недостатки__: Если вы работаете только с простыми коллекциями, то вам нет необходимости использовать данный паттерн.
1000
1121
___
1001
1122
### Наблюдатель
@@ -1174,7 +1295,7 @@ public class CorporatePortal : IObservable<Message>
1174
1295
```
1175
1296
> Несколько комментариев касательно Unsubscriber: нам необходимо, чтобы помимо подписки на событие, у пользователя была возможность и отписаться от события. В Unsubscriber должен храниться список всех подписчиков и конкретный подписчик, с которым будет происходить взаимодействие.
1176
1297
1177
-
:four: Теперь давайте реализуем данный класс.<br><br>
1298
+
:four: Теперь давайте реализуем данный класс.<br><br>
1178
1299
:pushpin:__Обратите внимание__, что он должен реализовывать интерфейс __IDisposable__, в котором содержится метод Dispose - именно так будет происходить отписка пользователя от уведомлений корпоративного портала.
1179
1300
```C#
1180
1301
/// <summary>
@@ -1465,7 +1586,7 @@ public class TFS : IMediator
1465
1586
}
1466
1587
}
1467
1588
```
1468
-
:white_check_mark:__Преимущества паттерна Mediator__: Достигается устранение зависимости между компонентами, благодаря чему их можно повторно использовать, более удобным становится взаимодействие между компонентами, также управление компонентами централизовано<br>
1589
+
:white_check_mark:__Преимущества паттерна Mediator__: Достигается устранение зависимости между компонентами, благодаря чему их можно повторно использовать, более удобным становится взаимодействие между компонентами, также управление компонентами централизовано.<br>
1469
1590
:x:__Недостатки__: Код посредника может быть очень большим.
0 commit comments