HTML Diff
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