0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<ul><li><a>Немного истории</a></li>
1
<ul><li><a>Немного истории</a></li>
2
<li><a>Какова польза?</a></li>
2
<li><a>Какова польза?</a></li>
3
<li><a>Порождающие паттерны</a></li>
3
<li><a>Порождающие паттерны</a></li>
4
<li><a>Структурные паттерны</a></li>
4
<li><a>Структурные паттерны</a></li>
5
<li><a>Поведенческие паттерны</a></li>
5
<li><a>Поведенческие паттерны</a></li>
6
<li><a>Другие классификации</a></li>
6
<li><a>Другие классификации</a></li>
7
<li><a>Как сделать правильный выбор?</a></li>
7
<li><a>Как сделать правильный выбор?</a></li>
8
</ul><p>В этой статье поговорим о том, что такое<strong>паттерны проектирования</strong>, какие они бывают, для чего нужны. Материал будет полезен начинающим программистам.</p>
8
</ul><p>В этой статье поговорим о том, что такое<strong>паттерны проектирования</strong>, какие они бывают, для чего нужны. Материал будет полезен начинающим программистам.</p>
9
<p><strong>Паттерны</strong>- это способ построения (структуризации) программного кода специальным образом. На практике они используются программистами для того, чтобы решить какую-нибудь проблему, устранить определенную "боль" разработчика. В этом случае предполагается, что существует некоторый перечень общих формализованных проблем (а это так и есть), причем данные проблемы встречаются относительно часто. И вот здесь-то на сцену и выходят паттерны, которые как раз таки и предоставляют способы решения этих проблем.</p>
9
<p><strong>Паттерны</strong>- это способ построения (структуризации) программного кода специальным образом. На практике они используются программистами для того, чтобы решить какую-нибудь проблему, устранить определенную "боль" разработчика. В этом случае предполагается, что существует некоторый перечень общих формализованных проблем (а это так и есть), причем данные проблемы встречаются относительно часто. И вот здесь-то на сцену и выходят паттерны, которые как раз таки и предоставляют способы решения этих проблем.</p>
10
<h2>Немного истории</h2>
10
<h2>Немного истории</h2>
11
<p>Сама по себе тема паттернов не является новой. Непосредственная идея по созданию принципов, описывающих решение распространенных в программировании/проектировании ПО проблем, появилась в далеком 1994 году. Именно в этом году в свет вышла известная книга "<strong>Design Patterns: Elements of Reusable Object-Oriented Software</strong>". Работа была создана целым авторским коллективом, который иногда называют "Gang of Four" (сокращенно GoF) - "Банда четырех". На деле это опытные инженеры-разработчики, вот их имена:</p>
11
<p>Сама по себе тема паттернов не является новой. Непосредственная идея по созданию принципов, описывающих решение распространенных в программировании/проектировании ПО проблем, появилась в далеком 1994 году. Именно в этом году в свет вышла известная книга "<strong>Design Patterns: Elements of Reusable Object-Oriented Software</strong>". Работа была создана целым авторским коллективом, который иногда называют "Gang of Four" (сокращенно GoF) - "Банда четырех". На деле это опытные инженеры-разработчики, вот их имена:</p>
12
<ul><li>Ральф Джонсон,</li>
12
<ul><li>Ральф Джонсон,</li>
13
<li>Ричард Хелм,</li>
13
<li>Ричард Хелм,</li>
14
<li>Эрих Гамма,</li>
14
<li>Эрих Гамма,</li>
15
<li>Джон Влиссидес.</li>
15
<li>Джон Влиссидес.</li>
16
</ul><p>Книга, о которой идет речь, - это первая серьезная попытка описать наиболее распространенные способы проектирования программного обеспечения. Спустя некоторое время, использование паттернов стало не прихотью разработчика, а хорошей практикой программирования.</p>
16
</ul><p>Книга, о которой идет речь, - это первая серьезная попытка описать наиболее распространенные способы проектирования программного обеспечения. Спустя некоторое время, использование паттернов стало не прихотью разработчика, а хорошей практикой программирования.</p>
17
<h2>Какова польза?</h2>
17
<h2>Какова польза?</h2>
18
<p>Но существует ли реальный профит от использования паттернов? При грамотном применении - безусловно. Когда вы пишете программный код, вы можете формализовать проблему в виде объектов, классов и соответствующих связей между ними. Когда проблема формализована, для ее решения останется задействовать один из существующих паттернов. Это экономит время программиста, ведь не надо изобретать велосипед и что-нибудь придумывать. Готовый pattern (способ решения) уже существует - нужно лишь правильно применить его в конкретной программе.</p>
18
<p>Но существует ли реальный профит от использования паттернов? При грамотном применении - безусловно. Когда вы пишете программный код, вы можете формализовать проблему в виде объектов, классов и соответствующих связей между ними. Когда проблема формализована, для ее решения останется задействовать один из существующих паттернов. Это экономит время программиста, ведь не надо изобретать велосипед и что-нибудь придумывать. Готовый pattern (способ решения) уже существует - нужно лишь правильно применить его в конкретной программе.</p>
19
<p>Важный момент - использование того либо иного паттерна практически<strong>не зависит от языка программирования</strong>, системы или интерфейса. То есть принципы применения паттернов проектирования в Java, С-шарп и прочих языках будут аналогичными. </p>
19
<p>Важный момент - использование того либо иного паттерна практически<strong>не зависит от языка программирования</strong>, системы или интерфейса. То есть принципы применения паттернов проектирования в Java, С-шарп и прочих языках будут аналогичными. </p>
20
<p>Подведем некоторый промежуточный итог:<strong>активное использование паттернов упрощает разработку программ</strong>. Есть и другой плюс: если программист, который столкнется с чужим кодом, знает примененный паттерн проектирования и его принципы, ему будет проще понять реализацию и внести изменения в код в случае надобности. </p>
20
<p>Подведем некоторый промежуточный итог:<strong>активное использование паттернов упрощает разработку программ</strong>. Есть и другой плюс: если программист, который столкнется с чужим кодом, знает примененный паттерн проектирования и его принципы, ему будет проще понять реализацию и внести изменения в код в случае надобности. </p>
21
<p>Но у этой медали есть и другая сторона. Да, хорошая программа может подразумевать использование шаблонов проектирования. Но может и не подразумевать. А все потому, что не всегда они позволяют упрощать и улучшать программный код. То есть речь идет о том, что использовать паттерны везде и всюду, то есть<strong>применять паттерны ради самих паттернов - это явно плохая практика</strong>. Не стоит забывать, что неоправданное применение усложнит код, снизит его качество. Просто помните, что pattern ВСЕГДА должен быть оправданным - и лишь в этом случае он сможет эффективно решить проблему.</p>
21
<p>Но у этой медали есть и другая сторона. Да, хорошая программа может подразумевать использование шаблонов проектирования. Но может и не подразумевать. А все потому, что не всегда они позволяют упрощать и улучшать программный код. То есть речь идет о том, что использовать паттерны везде и всюду, то есть<strong>применять паттерны ради самих паттернов - это явно плохая практика</strong>. Не стоит забывать, что неоправданное применение усложнит код, снизит его качество. Просто помните, что pattern ВСЕГДА должен быть оправданным - и лишь в этом случае он сможет эффективно решить проблему.</p>
22
<p>Сегодня существует очень много разных паттернов. Они решают различные вопросы, выполняют разные задачи. И действует они по-разному, поэтому их можно классифицировать по группам. В основе такой классификации и объединения в группы будут лежать поставленные цели и решаемые задачи.</p>
22
<p>Сегодня существует очень много разных паттернов. Они решают различные вопросы, выполняют разные задачи. И действует они по-разному, поэтому их можно классифицировать по группам. В основе такой классификации и объединения в группы будут лежать поставленные цели и решаемые задачи.</p>
23
<h2>Порождающие паттерны</h2>
23
<h2>Порождающие паттерны</h2>
24
<p>Порождающие паттерны абстрагируют процесс инстанцирования (процесс порождения классов и объектов). Вот их список:</p>
24
<p>Порождающие паттерны абстрагируют процесс инстанцирования (процесс порождения классов и объектов). Вот их список:</p>
25
<ul><li><strong>Abstract Factory - "Абстрактная фабрика";</strong></li>
25
<ul><li><strong>Abstract Factory - "Абстрактная фабрика";</strong></li>
26
<li><strong>Builder - "Строитель";</strong></li>
26
<li><strong>Builder - "Строитель";</strong></li>
27
<li><strong>Factory Method - "Фабричный метод";</strong></li>
27
<li><strong>Factory Method - "Фабричный метод";</strong></li>
28
<li><strong>Prototype - "Прототип";</strong></li>
28
<li><strong>Prototype - "Прототип";</strong></li>
29
<li><strong>Singleton - "Одиночка".</strong></li>
29
<li><strong>Singleton - "Одиночка".</strong></li>
30
</ul><h2>Структурные паттерны</h2>
30
</ul><h2>Структурные паттерны</h2>
31
<p>В этой группе рассматривается, каким образом классы и объекты формируют более крупные структуры (речь идет о более сложных по характеру классах и создаваемых объектах). Перечень структурных шаблонов:</p>
31
<p>В этой группе рассматривается, каким образом классы и объекты формируют более крупные структуры (речь идет о более сложных по характеру классах и создаваемых объектах). Перечень структурных шаблонов:</p>
32
<ul><li><strong>Adapter - "Адаптер";</strong></li>
32
<ul><li><strong>Adapter - "Адаптер";</strong></li>
33
<li><strong>Bridge - "Мост";</strong></li>
33
<li><strong>Bridge - "Мост";</strong></li>
34
<li><strong>Composite - "Компоновщик";</strong></li>
34
<li><strong>Composite - "Компоновщик";</strong></li>
35
<li><strong>Decorator - "Декоратор";</strong></li>
35
<li><strong>Decorator - "Декоратор";</strong></li>
36
<li><strong>Facade - "Фасад";</strong></li>
36
<li><strong>Facade - "Фасад";</strong></li>
37
<li><strong>Flyweight - "Приспособленец";</strong></li>
37
<li><strong>Flyweight - "Приспособленец";</strong></li>
38
<li><strong>Proxy - "Заместитель".</strong></li>
38
<li><strong>Proxy - "Заместитель".</strong></li>
39
</ul><h2>Поведенческие паттерны</h2>
39
</ul><h2>Поведенческие паттерны</h2>
40
<p>Группа под номером 3 объединяет шаблоны, связанные с<strong>поведением</strong>. Они определяют алгоритмы взаимодействия между объектами и классами, то есть их поведение. Вот перечень наиболее популярных поведенческих паттернов:</p>
40
<p>Группа под номером 3 объединяет шаблоны, связанные с<strong>поведением</strong>. Они определяют алгоритмы взаимодействия между объектами и классами, то есть их поведение. Вот перечень наиболее популярных поведенческих паттернов:</p>
41
<ul><li><strong>Chain of responsibility - "</strong><strong>Цепочка</strong><strong></strong><strong>обязанностей</strong><strong>";</strong></li>
41
<ul><li><strong>Chain of responsibility - "</strong><strong>Цепочка</strong><strong></strong><strong>обязанностей</strong><strong>";</strong></li>
42
<li><strong>Command - "Команда";</strong></li>
42
<li><strong>Command - "Команда";</strong></li>
43
<li><strong>Interpreter - "Интерпретатор";</strong></li>
43
<li><strong>Interpreter - "Интерпретатор";</strong></li>
44
<li><strong>Iterator - "Итератор";</strong></li>
44
<li><strong>Iterator - "Итератор";</strong></li>
45
<li><strong>Mediator - "Посредник";</strong></li>
45
<li><strong>Mediator - "Посредник";</strong></li>
46
<li><strong>Memento - "Хранитель";</strong></li>
46
<li><strong>Memento - "Хранитель";</strong></li>
47
<li><strong>Observer - "Наблюдатель";</strong></li>
47
<li><strong>Observer - "Наблюдатель";</strong></li>
48
<li><strong>State - "Состояние";</strong></li>
48
<li><strong>State - "Состояние";</strong></li>
49
<li><strong>Strategy - "Стратегия";</strong></li>
49
<li><strong>Strategy - "Стратегия";</strong></li>
50
<li><strong>Template method - "Шаблонный метод";</strong></li>
50
<li><strong>Template method - "Шаблонный метод";</strong></li>
51
<li><strong>Visitor - "Посетитель".</strong></li>
51
<li><strong>Visitor - "Посетитель".</strong></li>
52
</ul><h2>Другие классификации</h2>
52
</ul><h2>Другие классификации</h2>
53
<p>В зависимости от того, относится pattern к объектам или классам, существуют и другие классификации паттернов.</p>
53
<p>В зависимости от того, относится pattern к объектам или классам, существуют и другие классификации паттернов.</p>
54
<p>К примеру,<strong>паттерны классов</strong>описывают взаимодействие между классами с помощью наследования, причем эти отношения определяются на этапе компиляции. Вот примеры:</p>
54
<p>К примеру,<strong>паттерны классов</strong>описывают взаимодействие между классами с помощью наследования, причем эти отношения определяются на этапе компиляции. Вот примеры:</p>
55
<ul><li><strong>Factory Method;</strong></li>
55
<ul><li><strong>Factory Method;</strong></li>
56
<li><strong>Interpreter;</strong></li>
56
<li><strong>Interpreter;</strong></li>
57
<li><strong>Template Method;</strong></li>
57
<li><strong>Template Method;</strong></li>
58
<li><strong>Adapter.</strong></li>
58
<li><strong>Adapter.</strong></li>
59
</ul><p>Следующая группа - это <strong>паттерны объектов</strong>, описывающие взаимодействие между объектами. Отношения такого характера возникают на стадии выполнения, следовательно, они более гибкие. Примеры:</p>
59
</ul><p>Следующая группа - это <strong>паттерны объектов</strong>, описывающие взаимодействие между объектами. Отношения такого характера возникают на стадии выполнения, следовательно, они более гибкие. Примеры:</p>
60
<ul><li><strong>Abstract Factory;</strong></li>
60
<ul><li><strong>Abstract Factory;</strong></li>
61
<li><strong>Builder;</strong></li>
61
<li><strong>Builder;</strong></li>
62
<li><strong>Prototype;</strong></li>
62
<li><strong>Prototype;</strong></li>
63
<li><strong>Singleton;</strong></li>
63
<li><strong>Singleton;</strong></li>
64
<li><strong>Bridge;</strong></li>
64
<li><strong>Bridge;</strong></li>
65
<li><strong>Composite;</strong></li>
65
<li><strong>Composite;</strong></li>
66
<li><strong>Decorator;</strong></li>
66
<li><strong>Decorator;</strong></li>
67
<li><strong>Facade;</strong></li>
67
<li><strong>Facade;</strong></li>
68
<li><strong>Flyweight;</strong></li>
68
<li><strong>Flyweight;</strong></li>
69
<li><strong>Proxy;</strong></li>
69
<li><strong>Proxy;</strong></li>
70
<li><strong>Chain of responsibility</strong><strong>;</strong></li>
70
<li><strong>Chain of responsibility</strong><strong>;</strong></li>
71
<li><strong>Command;</strong></li>
71
<li><strong>Command;</strong></li>
72
<li><strong>Iterator;</strong></li>
72
<li><strong>Iterator;</strong></li>
73
<li><strong>Mediator;</strong></li>
73
<li><strong>Mediator;</strong></li>
74
<li><strong>Memento;</strong></li>
74
<li><strong>Memento;</strong></li>
75
<li><strong>Observer;</strong></li>
75
<li><strong>Observer;</strong></li>
76
<li><strong>State;</strong></li>
76
<li><strong>State;</strong></li>
77
<li><strong>Strategy;</strong></li>
77
<li><strong>Strategy;</strong></li>
78
<li><strong>Visitor.</strong></li>
78
<li><strong>Visitor.</strong></li>
79
</ul><p>Мы перечислили лишь основные варианты, но в реальности их намного больше. Некоторые только начали использоваться, некоторые переживают пик популярности, а некоторые, наоборот, стали применяться реже. </p>
79
</ul><p>Мы перечислили лишь основные варианты, но в реальности их намного больше. Некоторые только начали использоваться, некоторые переживают пик популярности, а некоторые, наоборот, стали применяться реже. </p>
80
<h2>Как сделать правильный выбор?</h2>
80
<h2>Как сделать правильный выбор?</h2>
81
<p>Прежде чем принять какое-либо решение, следует выделить используемые сущности, а также связи между этими сущностями, после чего необходимо абстрагировать сущности от конкретной ситуации. Получив некую абстрактную форму, посмотрите, вписывается ли она в какой-нибудь из существующих паттернов. К примеру, если смысл решаемой задачи заключается в создании новых объектов, то стоит обратить внимание на порождающие паттерны. Это значит, что следует взять несколько родственных шаблонов из соответствующей группы и определить, какой из них подходит в большей мере с учетом поставленной задачи.</p>
81
<p>Прежде чем принять какое-либо решение, следует выделить используемые сущности, а также связи между этими сущностями, после чего необходимо абстрагировать сущности от конкретной ситуации. Получив некую абстрактную форму, посмотрите, вписывается ли она в какой-нибудь из существующих паттернов. К примеру, если смысл решаемой задачи заключается в создании новых объектов, то стоит обратить внимание на порождающие паттерны. Это значит, что следует взять несколько родственных шаблонов из соответствующей группы и определить, какой из них подходит в большей мере с учетом поставленной задачи.</p>
82
<p>То есть разработчику не только важно понимать смысл и назначение шаблона, но и явно представлять его абстрактную организацию, плюс возможные конкретные реализации, ведь они могут быть разными для одного и того же паттерна. С практикой, чем чаще сталкиваешься с различными реализациями, тем лучше знаешь и понимаешь непосредственный смысл шаблона. Но если вы его не понимаете, использовать его нежелательно, причем даже в том случае, если поначалу кажется, что это именно то, что необходимо именно сейчас.</p>
82
<p>То есть разработчику не только важно понимать смысл и назначение шаблона, но и явно представлять его абстрактную организацию, плюс возможные конкретные реализации, ведь они могут быть разными для одного и того же паттерна. С практикой, чем чаще сталкиваешься с различными реализациями, тем лучше знаешь и понимаешь непосредственный смысл шаблона. Но если вы его не понимаете, использовать его нежелательно, причем даже в том случае, если поначалу кажется, что это именно то, что необходимо именно сейчас.</p>
83
<p><strong>Вывод прост</strong>: придерживайтесь известного принципа<strong>KISS</strong>(Keep It Simple, Stupid), то есть сохраняйте программный код простым и ясным настолько, насколько это возможно. Иначе теряется весь смысл паттернов проектирования, который заключается именно в упрощении программы.</p>
83
<p><strong>Вывод прост</strong>: придерживайтесь известного принципа<strong>KISS</strong>(Keep It Simple, Stupid), то есть сохраняйте программный код простым и ясным настолько, насколько это возможно. Иначе теряется весь смысл паттернов проектирования, который заключается именно в упрощении программы.</p>
84
<p>Хотите поработать с популярными шаблонами проектирования для Java? Желаете попробовать поработать с паттернами для C#? Обратите внимание на наши продвинутые https://otus.ru/catalog/courses?categories=programming на Java и C#:</p>
84
<p>Хотите поработать с популярными шаблонами проектирования для Java? Желаете попробовать поработать с паттернами для C#? Обратите внимание на наши продвинутые https://otus.ru/catalog/courses?categories=programming на Java и C#:</p>
85
<a></a><a></a><p>Также в Otus существует специальный курс "<a>Архитектура и шаблоны проектирования</a>", посвященный паттернам. Не пропустите! </p>
85
<a></a><a></a><p>Также в Otus существует специальный курс "<a>Архитектура и шаблоны проектирования</a>", посвященный паттернам. Не пропустите! </p>
86
<p>По материалам<em>https://metanit.com/.</em></p>
86
<p>По материалам<em>https://metanit.com/.</em></p>
87
87