Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit ae21713

Browse files
2 parents 784e8d7 + 4ee0175 commit ae21713

File tree

1 file changed

+130
-9
lines changed

1 file changed

+130
-9
lines changed

‎README.md‎

Lines changed: 130 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ public class Worker
183183
public int GetAccessoriesCost() => _workingDevice.GetAccessoriesCost();
184184
}
185185
```
186-
:white_check_mark: __Преимущества паттерна Abstract Factory__: упрощение добавления новых продуктов, их сочетаемость, а также избавление кода от привязки к конкретным классам продуктов.<br>
186+
:white_check_mark: __Преимущества паттерна Abstract Factory__: упрощение добавления новых продуктов, их сочетаемость, а также избавление кода от привязки к конкретным классам продуктов.<br>
187187
:x: __Недостатки__: возможное усложнение кода из-за создания огромного количества вспомогательных классов.
188188
____
189189
### Одиночка
@@ -216,7 +216,7 @@ public class Section
216216
:two: Создаем заблокированный объект, который мы будем использовать для синхронизации. Это означает, что в критическую область кода потоки будут заходить по очереди.<br>
217217
:three: Создаем список разделов, в который мы будем добавлять созданные разделы.<br>
218218
:four: Создаем защищенный конструктор. Это необходимо для того, чтобы у нас не было возможности вызвать публичный конструктор, так как в этом случае мы не сможем контролировать количество созданных экземпляров класса SectionDatabase.<br>
219-
:five: Добавляем публичный метод __Initialize__. Его назначение - инициализировать объект базы данных, а также проверять: если объект базы данных уже был создан, то необходимо возврать уже ранее созданный экземпляр. Также не забываем про использование синхронизации для критической секции.<br><br>
219+
:five: Добавляем публичный метод __Initialize__. Его назначение - инициализировать объект базы данных, а также проверять: если объект базы данных уже был создан, то необходимо возврать уже ранее созданный экземпляр. Также не забываем про использование синхронизации для критической секции.<br><br>
220220
Теперь посмотрим на получившийся результат (код представлен в упрощенном виде, полная реализация доступна в репозитории):
221221
```C#
222222
/// <summary>
@@ -268,7 +268,7 @@ public class SectionDatabase
268268
}
269269
}
270270
```
271-
:white_check_mark: __Преимущества паттерна Singleton__: класс гарантированно имеет только один экземпляр и не более, у нас есть точка доступа к единственному экземпляру (в нашем случае это метод Initialize)<br>
271+
:white_check_mark: __Преимущества паттерна Singleton__: класс гарантированно имеет только один экземпляр и не более, у нас есть точка доступа к единственному экземпляру (в нашем случае это метод Initialize).<br>
272272
:x: __Недостатки__: нарушение принципа единой ответственности (Single Responsibility Principle), требуется особая обработка в многопоточной среде.
273273
___
274274
### Строитель
@@ -577,11 +577,132 @@ public class Customer : User
577577
> Здесь у нас уже присутствует класс Passport - это ссылочный тип, соответсвенно, мы не можем использовать неполное копирование. Если мы будем использовать неполное копирование, то у нас будет два заказчика ссылаться на один и тот же объект паспортных данных. Поэтому нам придется создать новый объект паспорта и вручную его проинициализировать.
578578
579579
Также, чтобы убедиться в том, что у нас создаются два абсолютно разных объекта, которые не ссылаются на одни и те же поля, рекомендую запустить тесты в проекте PrototypeTests, где происходит данная проверка.<br><br>
580-
:white_check_mark: __Преимущества паттерна Prototype__: клонирование объектов без привязки к конкретным классам, сокращение кода инициализации экземплятор классов<br>
580+
:white_check_mark: __Преимущества паттерна Prototype__: клонирование объектов без привязки к конкретным классам, сокращение кода инициализации экземплятор классов.<br>
581581
:x: __Недостатки__: Проблемы с клонированием составных объектов, то есть, тех объектов, которые внутри содержат другие объекты.
582582
___
583583
### Фабричный метод
584-
__Фабричный метод (Factory Method)__ -
584+
__Фабричный метод (Factory Method)__ - это порождающий паттерн проектирования, который определяет интерфейс для создания объектов определенного класса, но именно в подклассах принимается решение о типе объекта, который будет создан.<br>
585+
> :white_check_mark: Фабричный метод будет полезен, если мы заранее не знаем, объекты каких типов мы хотим создать.
586+
587+
У нас есть следующие участники:
588+
* базовый класс какого-либо продукта;
589+
* наследники базового класса продукта;
590+
* базовый класс создателя этого продукта;
591+
* создатели-наследники базового класса создателя, которые созданию продукты-наследники базового класса продукта<br>
592+
593+
:one: Реализуем паттерн на примере создания телефонов. Пусть у нас будет базовый класс __Phone__, содержащий следующие свойства:
594+
```C#
595+
/// <summary>
596+
/// Телефон.
597+
/// </summary>
598+
public abstract class Phone
599+
{
600+
/// <summary>
601+
/// Цена.
602+
/// </summary>
603+
public decimal Price { get; set; }
604+
605+
/// <summary>
606+
/// Модель.
607+
/// </summary>
608+
public string Model { get; set; } = string.Empty;
609+
610+
/// <summary>
611+
/// Процессор.
612+
/// </summary>
613+
public string Processor { get; set; } = string.Empty;
614+
615+
/// <summary>
616+
/// Оперативная память.
617+
/// </summary>
618+
public int RandomAccessMemory { get; set; }
619+
620+
/// <summary>
621+
/// Строковое представления объекта телефона.
622+
/// </summary>
623+
/// <returns>Данные телефона в виде строки.</returns>
624+
public override string ToString() => $"Цена = {Price} Модель = {Model} Процессор = {Processor} Оперативная память = {RandomAccessMemory}";
625+
}
626+
```
627+
:two: Создадим два класса наследника: Nokia и Samsung, в них добавим по одному дополнительному свойству.
628+
```C#
629+
/// <summary>
630+
/// Нокиа.
631+
/// </summary>
632+
public class Nokia : Phone
633+
{
634+
/// <summary>
635+
/// Работает ли батарея.
636+
/// </summary>
637+
public bool IsBatteryWork { get; set; }
638+
639+
/// <summary>
640+
/// Строковое представления объекта Нокиа.
641+
/// </summary>
642+
/// <returns>Данные Нокиа в виде строки.</returns>
643+
public override string ToString() => $"Нокиа: {base.ToString()} Работает ли батарея = {IsBatteryWork}";
644+
}
645+
646+
/// <summary>
647+
/// Самсунг.
648+
/// </summary>
649+
public class Samsung : Phone
650+
{
651+
/// <summary>
652+
/// Влючена ли сейчас фронтальная камера.
653+
/// </summary>
654+
public bool IsFrontCamera { get; set; }
655+
656+
/// <summary>
657+
/// Строковое представления объекта Самсунга.
658+
/// </summary>
659+
/// <returns>Данные Самсунга в виде строки.</returns>
660+
public override string ToString() => $"Самсунг: {base.ToString()} Включена ли фронтальная камера = {IsFrontCamera}";
661+
}
662+
```
663+
:three: Создадим интерфейс создателя телефонов IPhoneDeveloper:
664+
```C#
665+
/// <summary>
666+
/// Содержит методы для рабработчика телефонов.
667+
/// </summary>
668+
public interface IPhoneDeveloper
669+
{
670+
/// <summary>
671+
/// Создание телефона.
672+
/// </summary>
673+
/// <returns>Телефон.</returns>
674+
Phone CreatePhone();
675+
}
676+
```
677+
:four: Создадим разработчиков телефонов Нокиа и Самсунга, реализующих интерфейсы __IPhoneDeveloper__:
678+
```C#
679+
/// <summary>
680+
/// Разработчик телефонов фирмы Нокиа.
681+
/// </summary>
682+
public class NokiaDeveloper : IPhoneDeveloper
683+
{
684+
/// <summary>
685+
/// Создание телефона.
686+
/// </summary>
687+
/// <returns>Телефон.</returns>
688+
public Phone CreatePhone() => new Nokia();
689+
}
690+
691+
/// <summary>
692+
/// Разработчик телефонов фирмы Самсунг.
693+
/// </summary>
694+
public class SamsungDeveloper
695+
{
696+
/// <summary>
697+
/// Создание телефона.
698+
/// </summary>
699+
/// <returns>Телефон.</returns>
700+
public Phone CreatePhone() => new Samsung();
701+
}
702+
```
703+
:white_check_mark: __Преимущества паттерна Factory Method__: упрощение поддержки кода, так как продукт создается в отдельном классе.<br>
704+
:x: __Недостатки__: Значительное увеличение кода, так как для каждого класса продукта необходимо будет добавлять класс-создатель, который будет создавать данный продукт.
705+
___
585706
## Структурные паттерны
586707
__Структурные паттерны__ (Structural) - цель их применения заключается в том, что благодаря им вы можете совмещать и сочетать сущности вместе.
587708
___
@@ -802,7 +923,7 @@ __Поведенческие паттерны__ (Behavioral) описывают
802923
___
803924
### Итератор
804925
__Итератор (Iterator)__ - это поведенческий паттерн проектирования, благодаря которому у нас есть возможность последовательно обходить элементы составных объектов, при этом не раскрывая их внутреннего представления.<br>
805-
Идея паттерна в том, чтобы вынести поведение обхода коллекции из самой коллекции в __отдельный класс__.<br>
926+
Идея паттерна в том, чтобы вынести поведение обхода коллекции из самой коллекции в __отдельный класс__.<br>
806927
> :white_check_mark: Зная эту информацию, давайте теперь его реализуем.
807928
808929
Пусть у нас будет файловая система, которая будет хранить файлы. У каждого файла есть следующие свойства:
@@ -995,7 +1116,7 @@ public class FileSystemNumerator : IFileIterator
9951116
}
9961117
}
9971118
```
998-
:white_check_mark: __Преимущества паттерна Iterator__: достигается упрощение классов хранения данных<br>
1119+
:white_check_mark: __Преимущества паттерна Iterator__: достигается упрощение классов хранения данных.<br>
9991120
:x: __Недостатки__: Если вы работаете только с простыми коллекциями, то вам нет необходимости использовать данный паттерн.
10001121
___
10011122
### Наблюдатель
@@ -1174,7 +1295,7 @@ public class CorporatePortal : IObservable<Message>
11741295
```
11751296
> Несколько комментариев касательно Unsubscriber: нам необходимо, чтобы помимо подписки на событие, у пользователя была возможность и отписаться от события. В Unsubscriber должен храниться список всех подписчиков и конкретный подписчик, с которым будет происходить взаимодействие.
11761297
1177-
:four: Теперь давайте реализуем данный класс.<br><br>
1298+
:four: Теперь давайте реализуем данный класс.<br><br>
11781299
:pushpin: __Обратите внимание__, что он должен реализовывать интерфейс __IDisposable__, в котором содержится метод Dispose - именно так будет происходить отписка пользователя от уведомлений корпоративного портала.
11791300
```C#
11801301
/// <summary>
@@ -1465,7 +1586,7 @@ public class TFS : IMediator
14651586
}
14661587
}
14671588
```
1468-
:white_check_mark: __Преимущества паттерна Mediator__: Достигается устранение зависимости между компонентами, благодаря чему их можно повторно использовать, более удобным становится взаимодействие между компонентами, также управление компонентами централизовано<br>
1589+
:white_check_mark: __Преимущества паттерна Mediator__: Достигается устранение зависимости между компонентами, благодаря чему их можно повторно использовать, более удобным становится взаимодействие между компонентами, также управление компонентами централизовано.<br>
14691590
:x: __Недостатки__: Код посредника может быть очень большим.
14701591
___
14711592
### Шаблонный метод

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /