<!DOCTYPE html>
<html class="l-html" lang="ru">
<head>
<script>
mindbox = window.mindbox || function() { mindbox.queue.push(arguments); };
mindbox.queue = mindbox.queue || [];
mindbox('create', {
endpointId: 'skillbox.skillboxMediaWebsite'
});
</script>
<script src="https://api.s.mindbox.ru/scripts/v1/tracker.js" async></script>
<script>window.yaContextCb = window.yaContextCb || []</script>
<script src="https://yandex.ru/ads/system/context.js" async></script>
<!-- Google Tag Manager -->
<script async data-skip-moving="true" type="text/javascript">
/** Google Tagmanager */
;(function (w, d, s, l, i) {
w[l] = w[l] || [];
w[l].push({
'gtm.start':
new Date().getTime(), event: 'gtm.js'
});
var f = d.getElementsByTagName(s)[0],
j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : '';
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
f.parentNode.insertBefore(j, f);
})(window, document, 'script', 'dataLayer', 'GTM-NLCGQ25');
window.dataLayer = window.dataLayer || [];
function gtag() {
window.dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'GTM-NLCGQ25');
</script>
<!-- End Google Tag Manager -->
<!-- Retail Rocket -->
<script type="text/javascript">
var rrPartnerId = "6048a0d097a52514f050731f";
var rrApi = {};
var rrApiOnReady = rrApiOnReady || [];
rrApi.addToBasket = rrApi.order = rrApi.categoryView = rrApi.view =
rrApi.recomMouseDown = rrApi.recomAddToCart = function() {};
(function(d) {
var ref = d.getElementsByTagName('script')[0];
var apiJs, apiJsId = 'rrApi-jssdk';
if (d.getElementById(apiJsId)) return;
apiJs = d.createElement('script');
apiJs.id = apiJsId;
apiJs.async = true;
apiJs.src = "//cdn.retailrocket.ru/content/javascript/tracking.js";
ref.parentNode.insertBefore(apiJs, ref);
}(document));
</script>
<!-- End Retail Rocket -->
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta http-equiv="X-UA-Compatible" content="ie=edge"/>
<meta name="google-site-verification" content="UA-kf725UpqwkHenFmDQ05SW115fL9UdD9uXiFy-ibQ"/>
<meta name="robots" content="index, follow"/>
<link rel="dns-prefetch" href="//fonts.googleapis.com">
<link rel="shortcut icon" href="/favicon.ico">
<link rel="canonical" href="https://skillbox.ru/media/code/osnovnye-patterny-proektirovaniya-na-java/">
<link rel="preload" href="https://marketplace.canva.com/EAD2962NKnQ/2/0/1600w/canva-rainbow-gradient-pink-and-purple-zoom-virtual-background-_Tcjok-d9b4.jpg" as="image" />
<link rel="preload" href="https://via.placeholder.com/1170x250/92c952" as="image" />
<link rel="preload" href="https://via.placeholder.com/768x250/40E0D0" as="image" />
<link rel="preload" href="https://via.placeholder.com/375x250/ffbcee" as="image" />
<title>Основные паттерны проектирования: обзор с примерами на Java / Skillbox Media</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="keywords" content="Паттерны проектирования, шаблоны проектирования, паттерны проектирования java" />
<meta name="description" content="Паттерны проектирования — проверенные шаблоны для создания чистого и поддерживаемого кода. В статье мы простыми словами разбираем порождающие, структурные и поведенческие паттерны с примерами на Java." />
<link href="/bitrix/cache/css/s1/media/kernel_main/kernel_main_v1.css?177096852510536" type="text/css" rel="stylesheet" />
<link href="/bitrix/js/ui/fonts/opensans/ui.font.opensans.css?16341171742599" type="text/css" rel="stylesheet" />
<link href="/bitrix/js/main/popup/dist/main.popup.bundle.css?163411696226345" type="text/css" rel="stylesheet" />
<link href="//cdnjs.cloudflare.com/ajax/libs/Swiper/4.5.1/css/swiper.min.css" type="text/css" rel="stylesheet" />
<link href="/bitrix/cache/css/s1/media/page_a1ad23d5ae1fea4c6ac7c690c80a4763/page_a1ad23d5ae1fea4c6ac7c690c80a4763_v1.css?1771490810746236" type="text/css" rel="stylesheet" />
<link href="/bitrix/cache/css/s1/media/template_176a7c2453ad8025fa7d27f65ba6a4b1/template_176a7c2453ad8025fa7d27f65ba6a4b1_v1.css?1771490810442835" type="text/css" data-template-style="true" rel="stylesheet" />
<script type="text/javascript">if(!window.BX)window.BX={};if(!window.BX.message)window.BX.message=function(mess){if(typeof mess==='object'){for(let i in mess) {BX.message[i]=mess[i];} return true;}};</script>
<script type="text/javascript">(window.BX||top.BX).message({'JS_CORE_LOADING':'Загрузка...','JS_CORE_NO_DATA':'- Нет данных -','JS_CORE_WINDOW_CLOSE':'Закрыть','JS_CORE_WINDOW_EXPAND':'Развернуть','JS_CORE_WINDOW_NARROW':'Свернуть в окно','JS_CORE_WINDOW_SAVE':'Сохранить','JS_CORE_WINDOW_CANCEL':'Отменить','JS_CORE_WINDOW_CONTINUE':'Продолжить','JS_CORE_H':'ч','JS_CORE_M':'м','JS_CORE_S':'с','JSADM_AI_HIDE_EXTRA':'Скрыть лишние','JSADM_AI_ALL_NOTIF':'Показать все','JSADM_AUTH_REQ':'Требуется авторизация!','JS_CORE_WINDOW_AUTH':'Войти','JS_CORE_IMAGE_FULL':'Полный размер'});</script>
<script type="text/javascript" src="/bitrix/js/main/core/core.js?1634117028565340"></script>
<script>BX.setJSList(['/bitrix/js/main/core/core_ajax.js','/bitrix/js/main/core/core_promise.js','/bitrix/js/main/polyfill/promise/js/promise.js','/bitrix/js/main/loadext/loadext.js','/bitrix/js/main/loadext/extension.js','/bitrix/js/main/polyfill/promise/js/promise.js','/bitrix/js/main/polyfill/find/js/find.js','/bitrix/js/main/polyfill/includes/js/includes.js','/bitrix/js/main/polyfill/matches/js/matches.js','/bitrix/js/ui/polyfill/closest/js/closest.js','/bitrix/js/main/polyfill/fill/main.polyfill.fill.js','/bitrix/js/main/polyfill/find/js/find.js','/bitrix/js/main/polyfill/matches/js/matches.js','/bitrix/js/main/polyfill/core/dist/polyfill.bundle.js','/bitrix/js/main/core/core.js','/bitrix/js/main/polyfill/intersectionobserver/js/intersectionobserver.js','/bitrix/js/main/lazyload/dist/lazyload.bundle.js','/bitrix/js/main/polyfill/core/dist/polyfill.bundle.js','/bitrix/js/main/parambag/dist/parambag.bundle.js']);
BX.setCSSList(['/bitrix/js/main/lazyload/dist/lazyload.bundle.css','/bitrix/js/main/parambag/dist/parambag.bundle.css']);</script>
<script type="text/javascript">(window.BX||top.BX).message({'AMPM_MODE':false});(window.BX||top.BX).message({'MONTH_1':'Январь','MONTH_2':'Февраль','MONTH_3':'Март','MONTH_4':'Апрель','MONTH_5':'Май','MONTH_6':'Июнь','MONTH_7':'Июль','MONTH_8':'Август','MONTH_9':'Сентябрь','MONTH_10':'Октябрь','MONTH_11':'Ноябрь','MONTH_12':'Декабрь','MONTH_1_S':'января','MONTH_2_S':'февраля','MONTH_3_S':'марта','MONTH_4_S':'апреля','MONTH_5_S':'мая','MONTH_6_S':'июня','MONTH_7_S':'июля','MONTH_8_S':'августа','MONTH_9_S':'сентября','MONTH_10_S':'октября','MONTH_11_S':'ноября','MONTH_12_S':'декабря','MON_1':'янв','MON_2':'фев','MON_3':'мар','MON_4':'апр','MON_5':'май','MON_6':'июн','MON_7':'июл','MON_8':'авг','MON_9':'сен','MON_10':'окт','MON_11':'ноя','MON_12':'дек','DAY_OF_WEEK_0':'Воскресенье','DAY_OF_WEEK_1':'Понедельник','DAY_OF_WEEK_2':'Вторник','DAY_OF_WEEK_3':'Среда','DAY_OF_WEEK_4':'Четверг','DAY_OF_WEEK_5':'Пятница','DAY_OF_WEEK_6':'Суббота','DOW_0':'Вс','DOW_1':'Пн','DOW_2':'Вт','DOW_3':'Ср','DOW_4':'Чт','DOW_5':'Пт','DOW_6':'Сб','FD_SECOND_AGO_0':'#VALUE# секунд назад','FD_SECOND_AGO_1':'#VALUE# секунду назад','FD_SECOND_AGO_10_20':'#VALUE# секунд назад','FD_SECOND_AGO_MOD_1':'#VALUE# секунду назад','FD_SECOND_AGO_MOD_2_4':'#VALUE# секунды назад','FD_SECOND_AGO_MOD_OTHER':'#VALUE# секунд назад','FD_SECOND_DIFF_0':'#VALUE# секунд','FD_SECOND_DIFF_1':'#VALUE# секунда','FD_SECOND_DIFF_10_20':'#VALUE# секунд','FD_SECOND_DIFF_MOD_1':'#VALUE# секунда','FD_SECOND_DIFF_MOD_2_4':'#VALUE# секунды','FD_SECOND_DIFF_MOD_OTHER':'#VALUE# секунд','FD_SECOND_SHORT':'#VALUE#с','FD_MINUTE_AGO_0':'#VALUE# минут назад','FD_MINUTE_AGO_1':'#VALUE# минуту назад','FD_MINUTE_AGO_10_20':'#VALUE# минут назад','FD_MINUTE_AGO_MOD_1':'#VALUE# минуту назад','FD_MINUTE_AGO_MOD_2_4':'#VALUE# минуты назад','FD_MINUTE_AGO_MOD_OTHER':'#VALUE# минут назад','FD_MINUTE_DIFF_0':'#VALUE# минут','FD_MINUTE_DIFF_1':'#VALUE# минута','FD_MINUTE_DIFF_10_20':'#VALUE# минут','FD_MINUTE_DIFF_MOD_1':'#VALUE# минута','FD_MINUTE_DIFF_MOD_2_4':'#VALUE# минуты','FD_MINUTE_DIFF_MOD_OTHER':'#VALUE# минут','FD_MINUTE_0':'#VALUE# минут','FD_MINUTE_1':'#VALUE# минуту','FD_MINUTE_10_20':'#VALUE# минут','FD_MINUTE_MOD_1':'#VALUE# минуту','FD_MINUTE_MOD_2_4':'#VALUE# минуты','FD_MINUTE_MOD_OTHER':'#VALUE# минут','FD_MINUTE_SHORT':'#VALUE#мин','FD_HOUR_AGO_0':'#VALUE# часов назад','FD_HOUR_AGO_1':'#VALUE# час назад','FD_HOUR_AGO_10_20':'#VALUE# часов назад','FD_HOUR_AGO_MOD_1':'#VALUE# час назад','FD_HOUR_AGO_MOD_2_4':'#VALUE# часа назад','FD_HOUR_AGO_MOD_OTHER':'#VALUE# часов назад','FD_HOUR_DIFF_0':'#VALUE# часов','FD_HOUR_DIFF_1':'#VALUE# час','FD_HOUR_DIFF_10_20':'#VALUE# часов','FD_HOUR_DIFF_MOD_1':'#VALUE# час','FD_HOUR_DIFF_MOD_2_4':'#VALUE# часа','FD_HOUR_DIFF_MOD_OTHER':'#VALUE# часов','FD_HOUR_SHORT':'#VALUE#ч','FD_YESTERDAY':'вчера','FD_TODAY':'сегодня','FD_TOMORROW':'завтра','FD_DAY_AGO_0':'#VALUE# дней назад','FD_DAY_AGO_1':'#VALUE# день назад','FD_DAY_AGO_10_20':'#VALUE# дней назад','FD_DAY_AGO_MOD_1':'#VALUE# день назад','FD_DAY_AGO_MOD_2_4':'#VALUE# дня назад','FD_DAY_AGO_MOD_OTHER':'#VALUE# дней назад','FD_DAY_DIFF_0':'#VALUE# дней','FD_DAY_DIFF_1':'#VALUE# день','FD_DAY_DIFF_10_20':'#VALUE# дней','FD_DAY_DIFF_MOD_1':'#VALUE# день','FD_DAY_DIFF_MOD_2_4':'#VALUE# дня','FD_DAY_DIFF_MOD_OTHER':'#VALUE# дней','FD_DAY_AT_TIME':'#DAY# в #TIME#','FD_DAY_SHORT':'#VALUE#д','FD_MONTH_AGO_0':'#VALUE# месяцев назад','FD_MONTH_AGO_1':'#VALUE# месяц назад','FD_MONTH_AGO_10_20':'#VALUE# месяцев назад','FD_MONTH_AGO_MOD_1':'#VALUE# месяц назад','FD_MONTH_AGO_MOD_2_4':'#VALUE# месяца назад','FD_MONTH_AGO_MOD_OTHER':'#VALUE# месяцев назад','FD_MONTH_DIFF_0':'#VALUE# месяцев','FD_MONTH_DIFF_1':'#VALUE# месяц','FD_MONTH_DIFF_10_20':'#VALUE# месяцев','FD_MONTH_DIFF_MOD_1':'#VALUE# месяц','FD_MONTH_DIFF_MOD_2_4':'#VALUE# месяца','FD_MONTH_DIFF_MOD_OTHER':'#VALUE# месяцев','FD_MONTH_SHORT':'#VALUE#мес','FD_YEARS_AGO_0':'#VALUE# лет назад','FD_YEARS_AGO_1':'#VALUE# год назад','FD_YEARS_AGO_10_20':'#VALUE# лет назад','FD_YEARS_AGO_MOD_1':'#VALUE# год назад','FD_YEARS_AGO_MOD_2_4':'#VALUE# года назад','FD_YEARS_AGO_MOD_OTHER':'#VALUE# лет назад','FD_YEARS_DIFF_0':'#VALUE# лет','FD_YEARS_DIFF_1':'#VALUE# год','FD_YEARS_DIFF_10_20':'#VALUE# лет','FD_YEARS_DIFF_MOD_1':'#VALUE# год','FD_YEARS_DIFF_MOD_2_4':'#VALUE# года','FD_YEARS_DIFF_MOD_OTHER':'#VALUE# лет','FD_YEARS_SHORT_0':'#VALUE#л','FD_YEARS_SHORT_1':'#VALUE#г','FD_YEARS_SHORT_10_20':'#VALUE#л','FD_YEARS_SHORT_MOD_1':'#VALUE#г','FD_YEARS_SHORT_MOD_2_4':'#VALUE#г','FD_YEARS_SHORT_MOD_OTHER':'#VALUE#л','CAL_BUTTON':'Выбрать','CAL_TIME_SET':'Установить время','CAL_TIME':'Время','FD_LAST_SEEN_TOMORROW':'завтра в #TIME#','FD_LAST_SEEN_NOW':'только что','FD_LAST_SEEN_TODAY':'сегодня в #TIME#','FD_LAST_SEEN_YESTERDAY':'вчера в #TIME#','FD_LAST_SEEN_MORE_YEAR':'более года назад'});</script>
<script type="text/javascript">(window.BX||top.BX).message({'WEEK_START':'1'});</script>
<script type="text/javascript">(window.BX||top.BX).message({'LANGUAGE_ID':'ru','FORMAT_DATE':'DD.MM.YYYY','FORMAT_DATETIME':'DD.MM.YYYY HH:MI:SS','COOKIE_PREFIX':'BITRIX_SM','SERVER_TZ_OFFSET':'10800','UTF_MODE':'Y','SITE_ID':'s1','SITE_DIR':'/','USER_ID':'','SERVER_TIME':'1771703343','USER_TZ_OFFSET':'0','USER_TZ_AUTO':'Y','bitrix_sessid':'7a93bcbce898276f56a534533cf1334b'});</script>
<script type="text/javascript" src="/bitrix/js/main/date/main.date.js?159955296434530"></script>
<script type="text/javascript" src="/bitrix/js/main/popup/dist/main.popup.bundle.js?1634116962109107"></script>
<script type="text/javascript" src="/bitrix/js/main/core/core_date.js?163411653136080"></script>
<script type="text/javascript" src="/bitrix/js/ui/vue/vue2/prod/dist/vue.bundle.js?1635848017173206"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.5.1/js/swiper.min.js"></script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/fingerprintjs2/2.1.0/fingerprint2.min.js"></script>
<script type="text/javascript">BX.setCSSList(['/bitrix/js/main/core/css/core_date.css','/setka/css/setka_skillbox.css','/local/templates/.default/components/bitrix/news.detail/article/style.css','/static/css/newarticle.css','/local/templates/media/libs/jquery.formstyler.css','/local/templates/media/fonts/graphik-font/stylesheet.css','/static/css/main.css','/local/templates/media/template_styles.css']);</script>
<script src="https://cdn.skillbox.pro/frontend-libs/promo-banner/5.10.1/banner-plugin.min.js"></script>
<script type="text/javascript" async src="https://relap.io/api/v6/head.js?token=sI73Ph6a5BnkqK2o"></script>
<meta property="og:title" content="Основные паттерны проектирования на Java" />
<meta property="og:description" content="Простое введение в тему для новичков с примерами кода." />
<meta property="og:url" content="https://skillbox.ru/media/code/osnovnye-patterny-proektirovaniya-na-java/" />
<meta property="og:type" content="article" />
<meta property="og:site_name" content="skillbox.ru" />
<meta property="og:locale" content="ru_RU" />
<meta property="og:image" content="https://248006.selcdn.ru/main/iblock/215/2150e2cc590db73644b30c8c9556a8a1/be8538a0a51946e1fba4fa8d539d22c2.jpg" />
<meta name="relap-image" content="https://248006.selcdn.ru/main/iblock/215/2150e2cc590db73644b30c8c9556a8a1/be8538a0a51946e1fba4fa8d539d22c2.jpg" />
<meta property="og:image:width" content="600" />
<meta property="og:image:height" content="315" />
<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:image" content="https://248006.selcdn.ru/main/iblock/215/2150e2cc590db73644b30c8c9556a8a1/be8538a0a51946e1fba4fa8d539d22c2.jpg" />
<meta property="vk:image" content="https://248006.selcdn.ru/main/iblock/c17/c17275f168c317966abcf4014937e1d6/7933a50fa8183b939782e192baae6a7b.jpg" />
<meta property="article:author" content="Редакция «Код» Skillbox Media" />
<meta property="article:tag" content="статьи" />
<meta property="article:section" content="Код" />
<script type="text/javascript" src="/static/js/vendor.js?1771489421543641"></script>
<script type="text/javascript" src="/local/assets/js/common.js?177148933727419"></script>
<script type="text/javascript" src="/static/js/main.js?1771489421125222"></script>
<script type="text/javascript" src="/local/templates/media/js/main.js?17714893372418"></script>
<script type="text/javascript" src="/local/components/prmedia/popup.subscribe/templates/.default/script.js?17714893376820"></script>
<script type="text/javascript" src="/local/templates/.default/components/bitrix/news.detail/article/infinity.js?177148933713735"></script>
<script type="text/javascript" src="/local/templates/.default/components/bitrix/news/articles/script.js?1771489337246"></script>
<script type="text/javascript" src="/setka/js/setka_skillbox.js?1771489337106775"></script>
<script type="text/javascript" src="/local/templates/.default/components/bitrix/news.detail/article/script.js?17714893377503"></script>
<script type="text/javascript">var _ba = _ba || []; _ba.push(["aid", "84a6082a990bbac8858fb733b97bed30"]); _ba.push(["host", "skillbox.ru"]); (function() {var ba = document.createElement("script"); ba.type = "text/javascript"; ba.async = true;ba.src = (document.location.protocol == "https:" ? "https://" : "http://") + "bitrix.info/ba.js";var s = document.getElementsByTagName("script")[0];s.parentNode.insertBefore(ba, s);})();</script>
</head>
<body>
<div class="js-sticky-delimiter"></div>
<div class="bx-panel"></div>
<!-- Google Tag Manager (noscript) -->
<noscript>
<iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NLCGQ25" height="0" width="0"
style="display:none;visibility:hidden"></iframe>
</noscript>
<!-- End Google Tag Manager (noscript) -->
<svg class="app-svg-visually-hidden" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<path id="def-arrow-down-a" d="M223 20813l4 5 4-5z"/>
<path id="def-arrow-a" d="M1044.6 803.2a.81.81 0 01-.5.18.8.8 0 01-.8-.8v-3.24c-2.97.1-5.17.88-6.52 2.3a4.86 4.86 0 00-1.39 3.29.8.8 0 01-.75.83h-.04a.79.79 0 01-.79-.74c-.22-3.78.69-6.76 2.69-8.84a10.76 10.76 0 016.81-3.07v-3.3a.8.8 0 011.29-.63l7.91 6.39a.8.8 0 010 1.25zm.3-11.73v2.42a.5.5 0 01-.03.1.8.8 0 01-.05.21.78.78 0 01-.47.42.67.67 0 01-.25.05h-.01c-.06 0-3.93-.04-6.46 2.62-.8.85-1.4 1.87-1.74 2.99 1.79-1.7 4.55-2.57 8.21-2.57.44 0 .8.36.8.8v2.4l5.85-4.72z"/>
<path id="def-be-a" d="M55.6 29.58h6.12v-1.59H55.6zm.64 5.74s.26-2.23 2.58-2.23c2.32 0 2.26 2.23 2.26 2.23zm-3.23 1.27S52.56 42 58.72 42c0 0 5.26.37 5.26-3.81H61.4s-.09 1.59-2.58 1.59c0 0-2.58.17-2.58-2.55l7.74-.01c-.08-.32.9-6.42-5.16-6.36-5.77.05-5.81 5.73-5.81 5.73zm-10.34 2.8v-4.24H47s1.7.16 1.7 2.24c0 1.76-1.06 1.99-1.7 2zM47 29.61s1.16.06 1.16 1.62-.76 1.64-1.49 1.64h-4v-3.26zm4.33 1.3c0-2.68-1.81-3.91-4.26-3.91H39v15.01h8.07s4.92.15 4.92-4.43c0 0 .22-3.73-2.9-3.73 0 0 2.24-.25 2.24-2.94z"/>
<path id="def-briefcase-a" d="M855 13538c0-1.7 1.3-3 3-3s3 1.3 3 3v7c0 1.7-1.3 3-3 3s-3-1.3-3-3v-7z"/>
<path id="def-comments-a" d="M752 8958l-4 4v-12a1 1 0 011-1h11a1 1 0 011 1v7a1 1 0 01-1 1zm12-6v13l-3.2-4H751l2-2h9v-8h1c1 0 1 .45 1 1z"/>
<path id="def-eaye-a" d="M630 8956.22c0 1.04-3.58 5.21-8 5.21s-8-4.26-8-5.21c0-1.05 3.58-5.22 8-5.22s8 4.17 8 5.22zm-5 0h-3v-3.13a3.13 3.13 0 100 6.26 3.07 3.07 0 003-3.13z"/>
<path id="def-file-a" d="M493 9457a2 2 0 01-1.98-2v-16a2 2 0 011.98-2h19.82c1.13 0 2.07.87 2.15 2v16a2.15 2.15 0 01-2.15 2zm0-18v8.83l5.3-4.59a.98.98 0 011.35.05l5.34 5.39 3.27-2.48a.98.98 0 011.36.16l3.35 4.07V9439zm19.97 14.55l-4.27-5.18-3.21 2.43c-.4.3-.95.26-1.3-.09l-5.3-5.35-5.9 5.1v4.54h19.98zm-6.1-10.55a1.98 1.98 0 113.97.04 1.98 1.98 0 01-3.97-.04z"/>
<path id="def-gplus-a" d="M466 10169a4 4 0 013.87-3.99 4.14 4.14 0 012.93.99c-.33.36-.67.71-1.03 1.04-.72-.42-1.58-.75-2.41-.46a2.52 2.52 0 00-1.67 3.23c.41 1.35 2.09 2.1 3.4 1.52a2.22 2.22 0 001.33-1.51c-.78-.01-1.56 0-2.34-.03v-1.36h3.9a4.45 4.45 0 01-.83 3.2c-1 1.28-2.88 1.66-4.4 1.16a4 4 0 01-2.75-3.79z"/><path id="def-gplus-b" d="M476.34 10166h1.32l.01 1.33H479v1.33l-1.33.01v1.33h-1.33l-.01-1.33H475v-1.33l1.33-.01.01-1.33z"/>
<path id="def-inst-a" d="M1480.93 332c-3.5 0-3.95.02-5.32.07-1.37.07-2.3.28-3.14.6-.84.34-1.57.77-2.28 1.5a6.36 6.36 0 00-1.5 2.28 9.84 9.84 0 00-.6 3.14c-.07 1.37-.07 1.82-.07 5.32s.02 3.96.07 5.32c.07 1.37.28 2.31.6 3.14.34.85.77 1.58 1.5 2.29a6.51 6.51 0 002.28 1.5c.82.3 1.77.53 3.14.6 1.37.07 1.82.07 5.32.07s3.96-.02 5.32-.07a9.48 9.48 0 003.14-.6 6.14 6.14 0 002.29-1.5 6.36 6.36 0 001.5-2.29c.3-.81.53-1.77.6-3.14.07-1.36.07-1.82.07-5.32s-.02-3.95-.07-5.32a9.48 9.48 0 00-.6-3.14 6.14 6.14 0 00-1.5-2.28 6.36 6.36 0 00-2.29-1.5 9.84 9.84 0 00-3.14-.6c-1.38-.05-1.82-.07-5.32-.07zm0 2.32c3.45 0 3.85.02 5.22.07 1.27.05 1.94.26 2.4.45.6.25 1.03.52 1.48.97.45.45.73.89.97 1.5.18.44.39 1.14.45 2.39.07 1.37.07 1.76.07 5.21s-.01 3.85-.07 5.22a6.55 6.55 0 01-.45 2.4c-.24.6-.52 1.03-.97 1.48-.45.45-.88.73-1.49.97-.45.18-1.14.39-2.39.45-1.37.07-1.77.07-5.22.07-3.45 0-3.84-.01-5.21-.07a6.55 6.55 0 01-2.4-.45 4.11 4.11 0 01-1.49-.97 4.11 4.11 0 01-.97-1.49 7.52 7.52 0 01-.45-2.39c-.07-1.37-.07-1.77-.07-5.22 0-3.45.02-3.84.07-5.21.05-1.27.26-1.95.45-2.4.25-.6.52-1.04.97-1.49.45-.45.89-.72 1.5-.97a7.52 7.52 0 012.39-.45c1.35-.05 1.76-.07 5.21-.07z"/><path id="def-inst-b" d="M1480.93 349.2a4.3 4.3 0 110-8.59 4.3 4.3 0 010 8.6zm0-10.93a6.62 6.62 0 100 13.24 6.62 6.62 0 000-13.24z"/><path id="def-inst-c" d="M1486.27 338.01a1.54 1.54 0 113.09 0 1.54 1.54 0 01-3.09 0z"/>
<path id="def-like-down-a" d="M1004.33 543.66c-1.1 0-2.45-.86-2.61-3.31-.05-1.41.11-2.82.48-4.19h-2.96c-2.15 0-3.42-1.35-3.42-2.67 0-.39.05-.77.17-1.13a2.4 2.4 0 01-.99-2.03 2.35 2.35 0 011.02-2.05c-.12-.34-.18-.7-.17-1.06.86-.6 1.2-1.7.86-2.7 0-2.52 3.45-2.52 4.57-2.52h2.85c1.3.06 2.56.4 3.71 1 .67.36 1.41.6 2.18.67h3.23c.25 0 .5.11.65.31.12.14 1.1 1.47 1.1 4.69.03 1.8-.28 3.6-.9 5.31a.83.83 0 01-.67.5c-.03 0-3.27.4-4.85 1.98a10.32 10.32 0 00-2.8 5.94 1.4 1.4 0 01-1.45 1.26zm-6.84-10.17c0 .34.52 1 1.75 1h4.06a.83.83 0 01.8 1.1c-.5 1.5-.73 3.07-.72 4.65.08 1.1.44 1.6.79 1.72a11.94 11.94 0 013.23-6.67c1.57-1.58 4.2-2.18 5.32-2.38.41-1.37.62-2.8.61-4.24a8.18 8.18 0 00-.56-3.34h-2.75c-1-.07-1.97-.35-2.85-.81a7.53 7.53 0 00-3.04-.85h-2.85c-1.32 0-2.9.15-2.9.85-.02.11.02.22.09.3a.73.73 0 01.75.77.92.92 0 01-.85.87.85.85 0 00-.85.77c-.05.22.01.44.17.6.42.07.71.45.67.88a.87.87 0 01-.86.77.77.77 0 00-.83.85.8.8 0 00.87.85c.46.01.82.4.81.85 0 .43-.33.78-.76.8-.09.21-.12.44-.1.66z"/>
<path id="def-like-up-a" d="M944.67 520c1.1 0 2.45.87 2.61 3.32.05 1.4-.11 2.82-.48 4.18h2.96c2.15 0 3.42 1.36 3.42 2.67 0 .39-.05.77-.17 1.14a2.4 2.4 0 01.99 2.02c.04.81-.35 1.59-1.02 2.05.12.34.18.7.17 1.07-.86.6-1.2 1.7-.86 2.69 0 2.52-3.45 2.52-4.57 2.52h-2.85a8.94 8.94 0 01-3.71-.99 5.67 5.67 0 00-2.18-.67h-3.23a.83.83 0 01-.65-.32c-.12-.14-1.1-1.47-1.1-4.68-.03-1.81.28-3.62.9-5.32a.83.83 0 01.67-.5c.03 0 3.27-.4 4.85-1.98a10.32 10.32 0 002.8-5.93 1.4 1.4 0 011.45-1.27zm6.84 10.17c0-.34-.52-1-1.75-1h-4.06a.83.83 0 01-.8-1.1c.5-1.5.73-3.07.72-4.65-.08-1.1-.44-1.6-.79-1.72a11.94 11.94 0 01-3.23 6.67c-1.57 1.58-4.2 2.19-5.32 2.38a14.38 14.38 0 00-.61 4.25 8.18 8.18 0 00.56 3.33h2.75c1 .07 1.97.35 2.85.82.94.49 1.98.78 3.04.85h2.85c1.32 0 2.9-.15 2.9-.86a.35.35 0 00-.09-.3.73.73 0 01-.75-.77.92.92 0 01.85-.87c.44 0 .81-.33.85-.77a.65.65 0 00-.17-.6.81.81 0 01-.67-.87.87.87 0 01.86-.78.77.77 0 00.83-.85.8.8 0 00-.87-.85.83.83 0 01-.81-.85c0-.43.33-.78.76-.8.09-.21.12-.43.1-.66z"/>
<path id="def-like-a" d="M701.32 8960.32a.95.95 0 01-.95.95h-5.72c-.96 0-1.92-.95-2.87-.95h-.95v-6.68c.04-.6.4-1.12.95-1.36a4.78 4.78 0 002.87-4.37v-.96a.95.95 0 01.95-.95h.95c.53 0 .95.43.95.95v5.73h3.82a.9.9 0 01.96.96zm-14.31.95v-9.54h1.9a.96.96 0 01.97.95v7.64a.96.96 0 01-.96.95zm.99-8.3a.48.48 0 10.88.38.48.48 0 00-.88-.38z"/>
<path id="def-link-a" d="M626.02 1163.93l-.02 15.99 13.02.01v-4a.86.86 0 01.24-.68.9.9 0 01.66-.28 1 1 0 011 1v4.95a1 1 0 01-.29.7 1 1 0 01-.71.29H625a1 1 0 01-.71-.29 1 1 0 01-.29-.7V1163a1 1 0 011-1h3.95a1 1 0 011 1 .89.89 0 01-.93.93z"/><path id="def-link-b" d="M641.95 1171a1 1 0 01-1-1v-5.59l-9.25 9.3a.99.99 0 01-1.41-.01.99.99 0 01.01-1.41l9.24-9.29h-5.56a1 1 0 01-1-1 1 1 0 011-1h7.97a1 1 0 011 1v8a1 1 0 01-1 1z"/>
<path id="def-mail-a" d="M1058 261c0-.6-.4-1-1-1h-14c-.6 0-1 .4-1 1l8 6.5z"/><path id="def-mail-b" d="M1042 262.5v8.5c0 .6.4 1 1 1h14c.6 0 1-.4 1-1v-8.5l-8 6.5z"/>
<path id="def-outside-a" d="M1204.24 9231.16h-10.05c-.92 0-1.67-.75-1.67-1.68v-4.2c0-.46.38-.84.84-.84a.81.81 0 01.8.84v4.2h10.08v-16.8h-10.08v4.2a.81.81 0 01-.8.84.84.84 0 01-.84-.84v-4.2c0-.93.75-1.68 1.67-1.68h10.05c.92 0 1.67.75 1.67 1.68v16.8c0 .93-.75 1.68-1.67 1.68zm-15.56-10.92h11.37a.84.84 0 110 1.68h-11.36l1.91 1.92a.84.84 0 11-1.18 1.2l-3.35-3.36a.86.86 0 01-.24-.6v-.02a.83.83 0 01.24-.58l3.35-3.36a.83.83 0 011.18 0c.33.33.33.87 0 1.2z"/>
<path id="def-pencil-a" d="M1190.84 9818.68a.64.64 0 01-.19.13l-.07.06-4.42 1.82c-.1.05-.21.07-.32.07a.83.83 0 01-.77-1.15l1.84-4.4v-.02a.38.38 0 01.09-.13l.08-.13v-.01l10.82-10.82-.44-.44-3.56 3.57a.83.83 0 01-1.18-1.18l4.16-4.15a.81.81 0 011.17 0l1.03 1.03 1.86-1.86a.84.84 0 011.17 0l2.58 2.58c.33.32.33.85 0 1.18zm-2.88-1.7l-.58 1.41 1.41-.58zm.88-1.47l1.41 1.4 10.24-10.23-1.4-1.4zm12.69-12.68l-1.27 1.27 1.4 1.4 1.28-1.27z"/>
<path id="def-phone-a" d="M732.62 41c-2.25 0-6.37-2.73-10.24-6.78a33.08 33.08 0 01-5.22-6.96c-1.33-2.53-1.52-4.32-.56-5.31l2.91-2.72c.17-.16.4-.24.63-.23.24.02.46.13.61.32l3.79 4.58c.23.28.28.68.12 1.01l-1.47 3.08 5.24 5.48 2.93-1.54a.83.83 0 01.96.12l4.38 3.96c.17.16.28.38.3.63a.97.97 0 01-.22.67l-2.53 3.02c-.33.34-.81.67-1.63.67zm-14.76-17.78c-.15.21-.25 1.09.83 3.15 1.06 2 2.8 4.32 4.93 6.55 3.87 4.06 7.53 6.25 9 6.25.2 0 .3-.04.33-.08l1.94-2.3-3.27-2.95-2.98 1.56a.84.84 0 01-1.01-.17l-6.12-6.42a.92.92 0 01-.16-1.05l1.48-3.12-2.82-3.42z"/>
<path id="def-plus-a" d="M1223.33 4172.67h-6.66v6.66a.67.67 0 01-1.34 0v-6.66h-6.66a.67.67 0 010-1.34h6.66v-6.66a.67.67 0 011.34 0v6.66h6.66a.67.67 0 010 1.34z"/>
<path id="def-search-a" d="M1092.53 24.87a6.7 6.7 0 10-.05 13.4 6.7 6.7 0 00.05-13.4zm12.1 18.85a.95.95 0 01-1.35 0l-5.4-5.43a8.62 8.62 0 111.35-1.35l5.4 5.43c.37.37.37.98 0 1.35z"/>
<path id="def-shape-a" d="M879 13323h-4a1 1 0 01-1-1v-4a1 1 0 011-1h.85c-1.29-8.14-8.38-15.22-16.85-16.81v.81a1 1 0 01-1 1h-4a1 1 0 01-1-1v-.81c-8.47 1.6-15.56 8.67-16.85 16.81h.85a1 1 0 011 1v4a1 1 0 01-1 1h-4a1 1 0 01-1-1v-4a1 1 0 011-1h1.13c1.03-7.24 6.24-13.76 13.07-17h-6.48a1.98 1.98 0 01-1.72 1.01c-.97 0-1.8-.69-1.98-1.65a2 2 0 011.28-2.23 2 2 0 012.42.87H853v-1a1 1 0 011-1h4a1 1 0 011 1v1h12.27a2.01 2.01 0 110 2h-6.47c6.83 3.24 12.04 9.76 13.07 17H879a1 1 0 011 1v4a1 1 0 01-1 1zm-43-4h-2v2h2zm21-21h-2v2h2zm21 21h-2v2h2zm-22.93-12.51a.52.52 0 01.1-.18l.01-.03.03-.03a1 1 0 01.2-.21l.06-.04c.06-.04.12-.08.19-.1l.04-.02.09-.01.05-.01.16-.03.15.03h.04l.11.01.04.02.19.1.02.02.02.01a.92.92 0 01.24.25l.02.03c.04.05.08.12.1.18l.03.05c.02.07 2.33 7.26 8.51 10.59.26.14.45.39.51.68a.97.97 0 01-.2.82 23.7 23.7 0 00-3.99 8.81 8.02 8.02 0 012.21 5.57 1 1 0 01-1 1h-14a1 1 0 01-1-1 8.02 8.02 0 012.21-5.57 23.66 23.66 0 00-3.99-8.8 1 1 0 01.31-1.51c6.21-3.34 8.49-10.52 8.51-10.59l.03-.04zm.93 20.49a6 6 0 00-5.92 5.02h11.84a6 6 0 00-5.92-5.02zm-4.06-.9a8.17 8.17 0 018.12 0 25.8 25.8 0 013.47-7.78 20.33 20.33 0 01-6.53-6.96v6.93a2 2 0 01-.97 3.73 2.03 2.03 0 01-2.03-2 2 2 0 011-1.7v-6.96a20.33 20.33 0 01-6.53 6.96 25.8 25.8 0 013.47 7.78z"/>
<path id="def-strawberry-a" d="M873.26 13427.96a7.49 7.49 0 01-4.13-1.21 20.45 20.45 0 012.02 8.92c0 10.41-17.26 18.25-28.46 18.25-3.71 0-6.53-.86-8.17-2.48l-.1-.1c-3.9-4.01-2.65-13.97.62-21.78 3.77-9.01 9.53-14.39 15.41-14.39 3.1 0 6.17.68 8.97 1.99a8.12 8.12 0 01-.65-1.24c-1.09-2.7-.53-5.87 1.68-9.44a1 1 0 011.11-.45c.21.06 5.12 1.38 6.8 5.49.8 2.19.7 4.61-.29 6.72 1.25-.51 2.58-.79 3.92-.83 5.12 0 7.74 4.75 8.4 7.26a.97.97 0 01-.45 1.1 12.95 12.95 0 01-6.68 2.19zm-36.36 2.36c-3.42 8.19-3.85 16.84-.97 19.69l.08.09c1.26 1.18 3.62 1.82 6.68 1.82a38.27 38.27 0 0017.26-4.82c3.43-1.92 9.18-5.96 9.18-11.43a18.4 18.4 0 00-18.68-18.5c-5.93 0-10.89 6.79-13.55 13.15zm29.59-18.05c-.97-2.38-3.49-3.6-4.73-4.07-1.52 2.71-1.89 5.05-1.12 6.96.96 2.37 3.48 3.6 4.73 4.08 1.52-2.71 1.89-5.05 1.12-6.97zm5.5 7.13c-1.75.08-3.45.6-4.95 1.51.59 1.54 2.36 5.06 6.22 5.06 1.75-.08 3.45-.6 4.94-1.5-.59-1.55-2.36-5.07-6.21-5.07zm-13.43 13.54h3v3h-3zm-4-5h3v3h-3zm2 13h-3v-3h3zm-7-8h3v3h-3zm0-9h3v3h-3zm2 22h-3v-3h3zm-7-8h3v3h-3zm0-9h3v3h-3zm-5 14h3v3h-3zm0-9h3v3h-3z"/>
<path id="def-telegram-a" d="M823.8 272.93l-4.09 20.05c-.3 1.42-1.16 1.76-2.36 1.1l-6.52-4.77-3.13 3c-.55.47-.75.66-1.27.65-.5 0-.74-.3-1.03-1.1l-2.4-7.29-6.26-1.94c-1.01-.32-1.06-1.66.31-2.05l25.01-9.39c1.14-.52 2.18 0 1.74 1.74zm-17.39 18.55l.6-5.26 11.83-10.54c.31-.36.09-.88-.61-.42l-14.24 8.87z"/>
<path id="def-tm-a" d="M1406.46 346.34l13.28-8.34c.65-.44.86.05.57.39l-11.02 9.91-.57 4.96zm16.84-12.16l-23.32 8.83c-1.27.37-1.24 1.62-.3 1.93l5.84 1.82 2.24 6.86c.28.75.5 1.04.96 1.04.49 0 .67-.18 1.19-.62.58-.55 1.5-1.43 2.92-2.83l6.08 4.49c1.12.62 1.92.3 2.21-1.04l3.8-18.85c.41-1.63-.55-2.12-1.62-1.63z"/>
<path id="def-trash-a" d="M1175 9805h-1.09l-1.8 13.12a2.15 2.15 0 01-2.11 1.88h-8a2.14 2.14 0 01-2.1-1.88l-1.78-13.12H1157a1 1 0 010-2h5v-1a3 3 0 013-3h2a3 3 0 013 3v1h5a1 1 0 010 2zm-7-3a1 1 0 00-1-1h-2a1 1 0 00-1 1v1h4zm-7.87 3l1.75 12.9c.02.05.07.09.12.1h8c.06-.01.1-.05.12-.11l1.78-12.89zm6.87 3h2v6h-2zm-4 0h2v6h-2z"/>
<path id="def-triangle-a" d="M1238 6883l7.22 7.22 7.22-7.22z"/>
<path id="def-user-circle-a" d="M1265.24 30.18a10 10 0 01-2.18 10.9 6.94 6.94 0 00-4.7-4.69 5 5 0 10-4.66.01c-2.24.72-4 2.47-4.72 4.71a10 10 0 1116.26-10.93zm-6.22 1.82a3 3 0 11-6-.01 3 3 0 016 .01zm-8.3 10.48c.4-2.6 2.65-4.5 5.28-4.48 2.73 0 5.1 1.96 5.27 4.37l.03.09a9.9 9.9 0 01-10.57.02zM1256 46a12.01 12.01 0 000-24 12 12 0 100 24z"/>
<path id="def-vb-a" d="M955.45 276.38c.68 3.25.79 6.51-.02 9.76-.14.57-.36 1.11-.58 1.65-.84 2.05-2.5 3.13-4.57 3.73-1.63.48-3.31.69-5 .82-.89.07-2.29.03-3.18.02-.76-.01-.55-.04-1.04.45-.96.97-1.84 1.82-2.76 2.84a28 28 0 01-1.35 1.35v-4.93c0-.25-.07-.4-.3-.5-.26-.1-.5-.24-.75-.34a6.95 6.95 0 01-4.35-4.98 19.93 19.93 0 01-.51-6.16c.07-1.4.26-2.79.64-4.15a6.8 6.8 0 013.48-4.25 13.83 13.83 0 014.79-1.47 25.9 25.9 0 019.8.59 8.9 8.9 0 013.5 1.69 6.59 6.59 0 012.2 3.88zm-12.05-1.52c.54.04 1.07.15 1.6.28 1.98.5 3.52 1.53 4.32 3.43.42.99.63 2.02.7 3.08.02.27.15.42.43.42.27-.01.38-.19.39-.43.02-.21.01-.42.01-.64a7.41 7.41 0 00-1.39-4.12c-1.49-1.96-3.43-2.7-6-2.82-.31-.02-.49.1-.51.42-.01.31.21.36.45.38zm4.39 4.61c.11.4.21.81.26 1.22.03.27-.03.64.42.65.32.01.4-.13.43-.67a4.58 4.58 0 00-.68-2.46c-.96-1.52-2.37-2.16-4.16-2.32-.28-.03-.48.08-.52.37-.05.3.14.44.41.48.55.08 1.08.22 1.6.4a3.32 3.32 0 012.24 2.33zm-2.22-1.46a2.29 2.29 0 00-.89-.22c-.38.03-.58.19-.58.45.01.33.3.33.52.39l.27.06c.72.19 1.13.65 1.27 1.36.03.13.04.27.08.4.06.18.18.31.4.31.21-.01.34-.13.39-.32l.04-.35a2.4 2.4 0 00-1.5-2.08zm4.89 7.94c-.78-.65-1.6-1.25-2.47-1.78-1.02-.62-1.77-.45-2.47.49l-.11.14c-.32.39-.72.54-1.22.4a5.89 5.89 0 01-1.51-.74 6.76 6.76 0 01-2.77-3.19c-.35-.82-.19-1.35.54-1.88l.28-.2c.55-.45.68-.89.37-1.52a9.94 9.94 0 00-2.3-3.05 1.3 1.3 0 00-.97-.36 2.9 2.9 0 00-2.62 2.74c-.01.37.08.78.24 1.17 2.23 5.38 6.16 9.1 11.6 11.36.4.17.82.27 1.25.15a3.75 3.75 0 002.55-2.16c.28-.61.14-1.13-.39-1.57z"/>
<path id="def-ynadex-a" d="M471.93 10326.44h-.59c-.92 0-1.8-.64-1.8-2.24 0-1.67.83-2.35 1.68-2.35h.7v4.59zm.92-5.44h-1.6c-1.55 0-2.87 1.13-2.87 3.33 0 1.32.64 2.3 1.78 2.78l-2.13 3.68c-.07.12 0 .21.1.21h1c.08 0 .14-.03.17-.1l1.93-3.6h.7v3.6c0 .05.04.1.1.1h.86c.08 0 .11-.04.11-.1v-9.77c0-.09-.06-.13-.15-.13z"/>
<path id="def-ytube-a" d="M1343.37 349.72v-9.44l6.27 4.72zm-7.81-14.03a3.54 3.54 0 00-3.56 3.51v11.6a3.54 3.54 0 003.56 3.51h19.88a3.54 3.54 0 003.56-3.5V339.2a3.54 3.54 0 00-3.56-3.51h-19.88z"/>
</defs>
<symbol id="icon-arrow-chevron" viewBox="0 0 9 15"><path d="M7.07.862L0 7.93 7.072 15l1.06-1.06-6.011-6.01L8.13 1.922 7.07.862z"/></symbol>
<symbol id="icon-arrow-down" viewBox="0 0 8 5"><use xlink:href="#def-arrow-down-a" transform="translate(-223 -20813)"/></symbol>
<symbol id="icon-arrow-left" viewBox="0 0 18 12"><path d="M.1 6.3c-.1-.3 0-.6.1-.8l4.3-4.3c.3-.3.7-.3 1 0 .3.3.3.7 0 1l-3 3.1h14.1c.4 0 .7.3.7.7 0 .4-.3.7-.7.7H2.5l3.1 3.1c.3.3.3.8 0 1-.2.2-.3.2-.4.3-.2.1-.5 0-.7-.2L.2 6.6c-.1-.1-.1-.2-.1-.3z"/></symbol>
<symbol id="icon-arrow-menu" viewBox="0 0 10 5"><path fill-rule="evenodd" clip-rule="evenodd" d="M0 0l5 5 5-5H0z"/></symbol>
<symbol id="icon-arrow-right" viewBox="0 0 15 12"><path d="M14.19 5.77c.11.26.05.57-.15.78l-4.32 4.33a.72.72 0 01-1.02 0 .72.72 0 010-1.02l3.09-3.1H.69A.72.72 0 010 6.04c0-.38.31-.7.69-.72h11.1L8.7 2.23a.73.73 0 01.33-1.21c.24-.06.51.01.69.19l4.32 4.32a.6.6 0 01.15.24z"/></symbol>
<symbol id="icon-arrow" viewBox="0 0 20 17"><use xlink:href="#def-arrow-a" transform="translate(-1033 -789)"/></symbol>
<symbol id="icon-be" viewBox="0 0 25 16"><use xlink:href="#def-be-a" transform="translate(-39 -27)"/></symbol>
<symbol id="icon-be2-mob" viewBox="0 0 34 34"><path d="M15.426 16.508s1.507-.112 1.507-1.879S15.7 12 14.138 12H9v9.875h5.138s3.137.099 3.137-2.915c0 0 .137-2.452-1.85-2.452zm-4.162-2.753h2.874s.699 0 .699 1.027c0 1.028-.411 1.177-.877 1.177h-2.696v-2.204zm2.742 6.365h-2.742v-2.64h2.874s1.041-.013 1.041 1.357c0 1.142-.761 1.271-1.173 1.283zM23.408 12.582h-4.074v1.216h4.074v-1.216zM21.458 14.513c-3.797 0-3.794 3.793-3.794 3.793s-.26 3.775 3.794 3.775c0 0 3.38.193 3.38-2.626H23.1s.058 1.062-1.584 1.062c0 0-1.737.116-1.737-1.718h5.116s.56-4.286-3.437-4.286zm1.545 2.968h-3.244s.213-1.522 1.738-1.522 1.506 1.522 1.506 1.522z"/></symbol>
<symbol id="icon-be2" viewBox="0 0 56 56"><path d="M27.475 27.946s1.987-.148 1.987-2.479c0-2.33-1.625-3.467-3.685-3.467H19v13.024h6.777s4.137.13 4.137-3.844c0 0 .18-3.234-2.439-3.234zm-5.489-3.631h3.791s.921 0 .921 1.355-.542 1.551-1.156 1.551h-3.556v-2.906zm3.616 8.394h-3.616v-3.48h3.79s1.374-.018 1.374 1.788c0 1.506-1.004 1.677-1.548 1.692zM38.004 22.767H32.63v1.604h5.373v-1.604zM35.432 25.314c-5.009 0-5.004 5.003-5.004 5.003s-.344 4.98 5.004 4.98c0 0 4.456.254 4.456-3.464h-2.292s.077 1.4-2.088 1.4c0 0-2.291.154-2.291-2.266h6.748s.738-5.653-4.533-5.653zm2.037 3.915H33.19s.28-2.008 2.291-2.008c2.013 0 1.987 2.008 1.987 2.008z"/></symbol>
<symbol id="icon-briefcase" viewBox="834 13519 48 44"><path d="M836.5 13563c-1.4 0-2.5-1.2-2.5-2.6v-19.4c0 .6.4 1 1 1h1v18.4c0 .3.2.6.5.6h42.9c.3 0 .5-.3.5-.6v-18.4h1c.6 0 1-.4 1-1s-.4-1-1-1h-1v-10.4c0-.3-.2-.5-.5-.6h-42.9c-.3 0-.5.3-.5.6v10.4h-1c-.6 0-1 .4-1 1v-11.4c0-1.4 1.1-2.5 2.5-2.6H849v1c0 .6.4 1 1 1s1-.4 1-1v-1h14v1c0 .6.4 1 1 1 .3 0 .5-.1.7-.3.2-.2.3-.4.3-.7v-1h12.5c1.4 0 2.5 1.2 2.5 2.6v30.9c0 1.4-1.1 2.6-2.5 2.6h-43zm18.4-21H836v-2h18.9c.6 0 1 .4 1 1s-.4 1-1 1zm25.1-2v2h-18.9c-.6 0-1-.4-1-1s.4-1 1-1H880zm-13-16.8c0-2.3-1.9-4.2-4.2-4.2h-9.6c-2.3 0-4.2 1.9-4.2 4.2v3.8h2v-3.8c0-1.2 1-2.2 2.2-2.2h9.6c1.2 0 2.2 1 2.2 2.2v3.8h2v-3.8z"/><clipPath id="def-briefcase-b"><use xlink:href="#def-briefcase-a" overflow="visible"/></clipPath><g clip-path="url(#def-briefcase-b)"><path stroke-width="4" stroke-miterlimit="50" d="M855 13538c0-1.7 1.3-3 3-3s3 1.3 3 3v7c0 1.7-1.3 3-3 3s-3-1.3-3-3v-7z"/></g></symbol>
<symbol id="icon-burger" viewBox="0 0 20 14"><g fill-rule="evenodd"><path d="M0 0h20v2H0zM0 6h20v2H0zM0 12h20v2H0z"/></g></symbol>
<symbol id="icon-cancel-circle" viewBox="0 0 24 24"><path d="M12 24a12 12 0 110-24 12 12 0 010 24zm0-22a10 10 0 100 20 10 10 0 000-20zm4.71 13.29L13.41 12l3.3-3.29a1 1 0 00-.02-1.4 1 1 0 00-1.4-.02L12 10.59l-3.29-3.3a1 1 0 00-1.4.02 1 1 0 00-.02 1.4l3.3 3.29-3.3 3.29a1 1 0 00.02 1.4 1 1 0 001.4.02l3.29-3.3 3.29 3.3a1 1 0 001.42 0 1 1 0 000-1.42z"/></symbol>
<symbol id="icon-clip" viewBox="0 0 25 22"><path d="M12.1 21.37a1.02 1.02 0 01-.71-1.73L21.74 9.11a4.19 4.19 0 000-5.87 4.04 4.04 0 00-5.78 0l-12 12.21c-.59.49-.94 1.2-.97 1.97.05.49.28.95.63 1.29.31.35.77.53 1.23.48.74-.17 1.4-.57 1.89-1.15l9.42-9.58a.98.98 0 011.41 0c.39.4.39 1.04 0 1.44l-9.42 9.58A5.3 5.3 0 015.1 21.2a3.37 3.37 0 01-2.89-1.05A4.16 4.16 0 011 17.54a4.62 4.62 0 011.55-3.53l12-12.2a6.03 6.03 0 018.6 0 6.24 6.24 0 010 8.74L12.8 21.07a.98.98 0 01-.7.3z"/></symbol>
<symbol id="icon-clock" viewBox="0 0 24 24"><path d="M0 12a12 12 0 1124 0 12 12 0 01-24 0zm2 0a10 10 0 1020 0 10 10 0 00-20 0zm14 5a1 1 0 00.71-1.71L13 11.59V5a1 1 0 00-1-1 1 1 0 00-1 1v7a1 1 0 00.08.38c.05.12.12.24.21.33l4 4c.19.18.45.29.71.29z"/></symbol>
<symbol id="icon-close-menu" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.636 2.303L13.97.636 8.136 6.469 2.303.636.636 2.303 6.47 8.136.636 13.97l1.667 1.667 5.833-5.833 5.833 5.833 1.667-1.666-5.833-5.834 5.833-5.833z"/></symbol>
<symbol id="icon-close" viewBox="0 0 16 15"><g fill-rule="evenodd"><path d="M1.963.045l13.791 12.86-1.364 1.463L.6 1.508z"/><path d="M14.39.045L.6 12.905l1.364 1.463 13.79-12.86z"/></g></symbol>
<symbol id="icon-comments" viewBox="0 0 16 16"><use xlink:href="#def-comments-a" transform="translate(-748 -8949)"/></symbol>
<symbol id="icon-eaye" viewBox="0 0 16 11"><use xlink:href="#def-eaye-a" transform="translate(-614 -8951)"/></symbol>
<symbol id="icon-fb" viewBox="0 0 13 25"><path d="M8.44 25V13.6h3.83l.58-4.45H8.44V6.31c0-1.28.36-2.16 2.2-2.16H13V.18A29.7 29.7 0 009.57 0c-3.4 0-5.73 2.07-5.73 5.87v3.28H0v4.45h3.84V25z"/></symbol>
<symbol id="icon-fb2-mob" viewBox="0 0 34 34"><path fill-rule="evenodd" clip-rule="evenodd" d="M18.415 24.638v-7.131h2.457l.366-2.784h-2.823v-1.776c0-.8.23-1.351 1.411-1.351h1.514v-2.49A21.931 21.931 0 0019.14 9c-2.182 0-3.677 1.295-3.677 3.672v2.051H13v2.784h2.463v7.13h2.952z"/></symbol>
<symbol id="icon-fb2" viewBox="0 0 56 56"><path fill-rule="evenodd" clip-rule="evenodd" d="M30.142 38.625V29.22h3.24l.483-3.671H30.14v-2.343c0-1.056.305-1.782 1.862-1.782H34V18.14a28.937 28.937 0 00-2.902-.14c-2.877 0-4.849 1.708-4.849 4.843v2.706H23v3.671h3.25v9.405h3.892z"/></symbol>
<symbol id="icon-file" viewBox="0 0 24 20"><use xlink:href="#def-file-a" transform="translate(-491 -9437)"/></symbol>
<symbol id="icon-github-mob" viewBox="0 0 34 34"><path d="M17.2 10c-3.978 0-7.2 3.307-7.2 7.386 0 3.263 2.063 6.031 4.923 7.007.36.07.492-.16.492-.355 0-.175-.006-.64-.009-1.256-2.003.445-2.425-.99-2.425-.99-.328-.853-.801-1.081-.801-1.081-.652-.458.05-.449.05-.449.723.052 1.103.761 1.103.761.642 1.13 1.685.803 2.097.615.065-.478.25-.803.456-.988-1.599-.185-3.28-.82-3.28-3.65 0-.806.28-1.464.741-1.981-.08-.187-.324-.938.063-1.955 0 0 .603-.198 1.98.757a6.754 6.754 0 011.8-.25 6.754 6.754 0 011.8.25c1.368-.955 1.971-.757 1.971-.757.387 1.017.144 1.768.072 1.955.46.517.738 1.175.738 1.981 0 2.838-1.683 3.462-3.285 3.644.252.222.486.674.486 1.366 0 .989-.009 1.783-.009 2.023 0 .193.126.424.495.35 2.881-.969 4.942-3.739 4.942-6.997 0-4.079-3.224-7.386-7.2-7.386z"/></symbol>
<symbol id="icon-github" viewBox="0 0 56 56"><path d="M27.913 19C22.436 19 18 23.362 18 28.741c0 4.305 2.84 7.955 6.778 9.242.496.092.677-.21.677-.468 0-.232-.008-.844-.012-1.657-2.758.588-3.34-1.306-3.34-1.306-.45-1.125-1.102-1.425-1.102-1.425-.898-.604.07-.592.07-.592.995.068 1.518 1.004 1.518 1.004.884 1.49 2.32 1.059 2.887.81.09-.63.344-1.059.628-1.302-2.202-.244-4.515-1.082-4.515-4.814 0-1.063.384-1.932 1.02-2.614-.112-.246-.446-1.236.086-2.578 0 0 .83-.26 2.727.999a9.676 9.676 0 012.478-.329 9.676 9.676 0 012.478.329c1.883-1.26 2.714-.999 2.714-.999.532 1.342.198 2.332.099 2.578a3.737 3.737 0 011.016 2.614c0 3.742-2.317 4.566-4.523 4.805.347.293.67.89.67 1.803 0 1.303-.013 2.35-.013 2.667 0 .255.173.56.681.463 3.966-1.279 6.804-4.932 6.804-9.23 0-5.38-4.439-9.741-9.913-9.741z"/></symbol>
<symbol id="icon-gplus" viewBox="0 0 13 8"><use xlink:href="#def-gplus-a" transform="translate(-466 -10165)"/><use xlink:href="#def-gplus-b" transform="translate(-466 -10165)"/></symbol>
<symbol id="icon-head" viewBox="0 0 54 45"><g transform="translate(2 2)" fill-rule="evenodd"><path d="M9.23 19.458v17.61s14.232 8.328 28.462 0V19.231" fill-rule="nonzero"/><path stroke-width="3" fill-rule="nonzero" stroke-linecap="round" stroke-linejoin="round" d="M46.923 13.25L22.99 0 0 14.007l23.179 13.44L46.923 13.25V30"/><path d="M9.23 19.458v17.61s14.232 8.328 28.462 0V19.231" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/><circle stroke-width="3" fill-rule="nonzero" stroke-linecap="round" stroke-linejoin="round" cx="47.308" cy="32.692" r="2.692"/><path d="M32.733 18.745c.53.295 1.074.575 1.604.87 1.302.7 2.468-1.164 1.181-1.865-3.694-1.99-7.403-3.98-11.097-5.957-.53-.294-1.075-.575-1.604-.869-1.302-.7-2.468 1.163-1.181 1.864 3.694 1.99 7.403 3.981 11.097 5.957zM36.733 15.745c.53.295 1.074.575 1.604.87 1.302.7 2.468-1.164 1.181-1.865a4281.61 4281.61 0 00-11.097-5.957c-.53-.294-1.075-.575-1.604-.869-1.302-.7-2.468 1.163-1.181 1.864 3.694 1.99 7.403 3.981 11.097 5.957z" fill-rule="nonzero"/></g></symbol>
<symbol id="icon-inst" viewBox="0 0 26 26"><use xlink:href="#def-inst-a" transform="translate(-1468 -332)"/><use xlink:href="#def-inst-b" transform="translate(-1468 -332)"/><use xlink:href="#def-inst-c" transform="translate(-1468 -332)"/></symbol>
<symbol id="icon-instagram-mob" viewBox="0 0 34 34"><path fill-rule="evenodd" clip-rule="evenodd" d="M24.027 20.23a3.801 3.801 0 01-3.797 3.797h-6.433A3.801 3.801 0 0110 20.23v-6.433A3.801 3.801 0 0113.797 10h6.433a3.801 3.801 0 013.797 3.797v6.433zm-7.014-7.052a3.84 3.84 0 00-3.835 3.835 3.84 3.84 0 003.835 3.836 3.84 3.84 0 003.836-3.836 3.84 3.84 0 00-3.836-3.835zm0 6.848A3.016 3.016 0 0114 17.013 3.016 3.016 0 0117.013 14a3.016 3.016 0 013.013 3.013 3.016 3.016 0 01-3.013 3.013zm2.794-7.077c0-.625.509-1.133 1.133-1.133.625 0 1.134.508 1.134 1.133s-.509 1.134-1.134 1.134a1.135 1.135 0 01-1.133-1.134z"/></symbol>
<symbol id="icon-instagram" viewBox="0 0 56 56"><path fill-rule="evenodd" clip-rule="evenodd" d="M37.5 32.492a5.014 5.014 0 01-5.008 5.008h-8.484A5.014 5.014 0 0119 32.492v-8.484A5.014 5.014 0 0124.008 19h8.484a5.014 5.014 0 015.008 5.008v8.484zm-9.25-9.3a5.064 5.064 0 00-5.058 5.058c0 2.79 2.269 5.059 5.058 5.059 2.79 0 5.059-2.27 5.059-5.059 0-2.79-2.27-5.058-5.059-5.058zm0 9.032a3.978 3.978 0 01-3.974-3.974 3.978 3.978 0 013.974-3.974 3.978 3.978 0 013.974 3.974 3.978 3.978 0 01-3.974 3.974zm3.685-9.334c0-.825.67-1.495 1.494-1.495.825 0 1.495.67 1.495 1.495 0 .824-.67 1.495-1.495 1.495-.824 0-1.494-.67-1.494-1.495z"/></symbol>
<symbol id="icon-like-down" viewBox="0 0 20 22"><use xlink:href="#def-like-down-a" transform="translate(-995 -522)"/></symbol>
<symbol id="icon-like-up" viewBox="0 0 20 22"><use xlink:href="#def-like-up-a" transform="translate(-934 -520)"/></symbol>
<symbol id="icon-like" viewBox="0 0 16 16"><use xlink:href="#def-like-a" transform="translate(-687 -8946)"/></symbol>
<symbol id="icon-link" viewBox="0 0 19 21"><use xlink:href="#def-link-a" transform="translate(-624 -1161)"/><use xlink:href="#def-link-b" transform="translate(-624 -1161)"/></symbol>
<symbol id="icon-mail" viewBox="0 0 16 12"><use xlink:href="#def-mail-a" transform="translate(-1042 -260)"/><use xlink:href="#def-mail-b" transform="translate(-1042 -260)"/></symbol>
<symbol id="icon-minus-zoom" viewBox="0 0 26 2"><path stroke-linecap="square" stroke-miterlimit="50" stroke-width="2" d="M1.5 1h23.19"/></symbol>
<symbol id="icon-outside" viewBox="0 0 21 21"><use xlink:href="#def-outside-a" transform="translate(-1185 -9211)"/></symbol>
<symbol id="icon-pencil" viewBox="0 0 20 21"><use xlink:href="#def-pencil-a" transform="translate(-1185 -9800)"/></symbol>
<symbol id="icon-phone" viewBox="0 0 21 22"><use xlink:href="#def-phone-a" transform="translate(-716 -19)"/></symbol>
<symbol id="icon-play-circle" viewBox="0 0 24 24"><path d="M12 24a12 12 0 110-24 12 12 0 010 24zM2 12a10 10 0 1020 0 10 10 0 00-20 0z"/><path d="M11.01 14.52c-.05.28.1.55.35.67.25.13.55.07.74-.14l2.85-2.94c.26-.27.27-.7.02-.98l-2.83-2.94a.69.69 0 00-.75-.13.67.67 0 00-.38.65z"/></symbol>
<symbol id="icon-play-reviews" viewBox="0 0 9 9"><path fill-rule="evenodd" clip-rule="evenodd" d="M8.074 4.507c0 .41-.745.741-.745.741l-5.854 2.91a.619.619 0 01-.563-.054.649.649 0 01-.294-.494V1.392A.586.586 0 01.895.853a.557.557 0 01.595.01l5.839 2.903s.745.331.745.741z"/></symbol>
<symbol id="icon-play" viewBox="0 0 17 17"><path d="M17 9.02c0 .88-1.6 1.59-1.6 1.59L2.84 16.86c-.4.16-.84.12-1.21-.12A1.4 1.4 0 011 15.68V2.33c-.03-.47.2-.92.6-1.16.39-.24.89-.23 1.27.02L15.4 7.43s1.6.71 1.6 1.59z"/></symbol>
<symbol id="icon-plus-zoom" viewBox="0 0 24 24"><path d="M23 13H13v10a1 1 0 01-1 1 1 1 0 01-1-1V13H1a1 1 0 01-1-1 1 1 0 011-1h10V1a1 1 0 011-1 1 1 0 011 1v10h10a1 1 0 011 1 1 1 0 01-1 1z"/></symbol>
<symbol id="icon-plus" viewBox="0 0 16 16"><use xlink:href="#def-plus-a" transform="translate(-1208 -4164)"/></symbol>
<symbol id="icon-search" viewBox="0 0 22 22"><use xlink:href="#def-search-a" transform="translate(-1083 -22)"/></symbol>
<symbol id="icon-shape" viewBox="0 0 48 38"><use xlink:href="#def-shape-a" transform="translate(-832 -13296)"/></symbol>
<symbol id="icon-share" viewBox="0 0 26 24"><path d="M21.03 8a3.95 3.95 0 01-3.02-1.41l-9.08 4.54c.12.55.13 1.11.02 1.66l9.06 4.61a3.98 3.98 0 11-.9 1.79l-9.05-4.61a4 4 0 11-.05-5.22l9.1-4.55A4 4 0 1121.03 8zm0 14a2 2 0 002-2 2 2 0 10-2 2zm-18-10a2 2 0 104 0 2 2 0 00-4 0zm16-8a2 2 0 104 0 2 2 0 00-4 0z"/></symbol>
<symbol id="icon-smile" viewBox="0 0 23 24"><path fill-rule="evenodd" clip-rule="evenodd" d="M11.5 23.278c-6.351 0-11.5-5.148-11.5-11.5C0 5.427 5.149.278 11.5.278S23 5.427 23 11.778c-.005 6.35-5.15 11.495-11.5 11.5zm0-21.083a9.583 9.583 0 00-9.583 9.583 9.584 9.584 0 1019.167 0A9.599 9.599 0 0011.5 2.195zm-6.613 12.87a7.38 7.38 0 006.613 4.38 7.333 7.333 0 006.613-4.38.957.957 0 00-.93-1.427.96.96 0 00-.796.603 5.277 5.277 0 01-9.774 0 .959.959 0 00-1.726.824zm10.447-3.287a1.917 1.917 0 110-3.833 1.917 1.917 0 010 3.833zM5.75 9.862a1.917 1.917 0 103.833 0 1.917 1.917 0 00-3.833 0z"/></symbol>
<symbol id="icon-socials" viewBox="0 0 40 40"><g fill-rule="evenodd"><circle cx="20" cy="20" r="20"/><path d="M20.021 31h-.485C13.717 31 9 26.08 9 20.009c0-6.07 4.717-10.991 10.536-10.991.309-.024.619-.024.928 0 5.819 0 10.536 4.92 10.536 10.99C31 26.08 26.283 31 20.464 31h-.443zm0-2.198h.316c4.655 0 8.43-3.937 8.43-8.793s-3.775-8.793-8.43-8.793h-.632c-4.655 0-8.43 3.937-8.43 8.793s3.775 8.793 8.43 8.793h.316z"/><path d="M19.382 31C13.648 31 9 26.08 9 20.009c0-6.07 4.648-10.991 10.382-10.991.305-.024.61-.024.914 0 .252.02.488.138.665.33 5.385 5.95 5.385 15.338 0 21.29a.998.998 0 01-1.142.252.992.992 0 01-.437.11zm.322-19.784h-.238c-4.588 0-8.306 3.937-8.306 8.793s3.718 8.793 8.306 8.793a.981.981 0 01.26 0c4.23-5.007 4.23-12.58 0-17.586h-.022z" clip-rule="evenodd"/><path d="M19.91 30.967a1.101 1.101 0 01-.419-.077 1.101 1.101 0 01-1.21-.253c-5.708-5.95-5.708-15.337 0-21.288a1.1 1.1 0 01.704-.33 6.664 6.664 0 011.012 0C26.074 9.02 31 13.94 31 20.01S26.074 31 19.997 31l-.088-.033zm-.353-19.783a13.177 13.177 0 000 17.585c.091-.012.184-.012.275 0 4.861 0 8.802-3.936 8.802-8.792s-3.94-8.793-8.802-8.793h-.275z" clip-rule="evenodd"/><path d="M27.944 17H11.056C10.473 17 10 16.552 10 16s.473-1 1.056-1h16.888c.583 0 1.056.448 1.056 1s-.473 1-1.056 1zM27.944 25H11.056C10.473 25 10 24.552 10 24s.473-1 1.056-1h16.888c.583 0 1.056.448 1.056 1s-.473 1-1.056 1z"/></g></symbol>
<symbol id="icon-strawberry" viewBox="0 0 49 48"><use xlink:href="#def-strawberry-a" transform="translate(-832 -13406)"/></symbol>
<symbol id="icon-telegram" viewBox="0 0 29 24"><use xlink:href="#def-telegram-a" transform="translate(-795 -271)"/></symbol>
<symbol id="icon-telegram2-mob" viewBox="0 0 34 34"><path d="M14.95 19.329l-.25 3.528c.358 0 .514-.154.7-.34l1.683-1.607 3.486 2.553c.64.356 1.09.168 1.263-.588L24.12 12.15c.204-.946-.341-1.316-.964-1.084l-13.452 5.15c-.918.357-.904.869-.156 1.1l3.44 1.07 7.988-4.998c.375-.25.717-.112.436.137L14.95 19.33z"/></symbol>
<symbol id="icon-telegram2" viewBox="0 0 56 56"><path d="M25.848 30.985l-.331 4.653c.473 0 .678-.203.924-.447l2.22-2.121 4.598 3.367c.843.47 1.437.223 1.665-.776l3.018-14.143.001-.001c.268-1.247-.45-1.734-1.272-1.428L18.929 26.88c-1.211.47-1.193 1.145-.206 1.451l4.536 1.411 10.536-6.593c.495-.328.946-.146.575.182l-8.522 7.653z"/></symbol>
<symbol id="icon-tm" viewBox="0 0 26 22"><use xlink:href="#def-tm-a" transform="translate(-1399 -334)"/></symbol>
<symbol id="icon-trash" viewBox="0 0 20 21"><use xlink:href="#def-trash-a" transform="translate(-1156 -9799)"/></symbol>
<symbol id="icon-triangle" viewBox="0 0 16 8"><use xlink:href="#def-triangle-a" transform="translate(-1237 -6883)"/></symbol>
<symbol id="icon-tw" viewBox="0 0 18 15"><path d="M18 1.75c-.66.3-1.37.5-2.12.59A3.7 3.7 0 0017.5.27c-.71.43-1.5.74-2.34.91a3.68 3.68 0 00-6.39 2.56c0 .3.03.58.09.85A10.45 10.45 0 011.25.69 3.75 3.75 0 002.4 5.68a3.67 3.67 0 01-1.68-.47v.05a3.75 3.75 0 002.97 3.67 3.51 3.51 0 01-1.67.06 3.7 3.7 0 003.45 2.6A7.33 7.33 0 010 13.14a10.37 10.37 0 005.66 1.68c6.79 0 10.51-5.7 10.51-10.64l-.01-.49A7.35 7.35 0 0018 1.76z"/></symbol>
<symbol id="icon-twitter-mob" viewBox="0 0 34 34"><path d="M24.406 12.386a6.16 6.16 0 01-1.702.466 2.937 2.937 0 001.3-1.632c-.572.34-1.202.58-1.873.715a2.952 2.952 0 00-5.109 2.02c0 .233.02.458.068.672a8.36 8.36 0 01-6.087-3.089 2.957 2.957 0 00.908 3.947 2.917 2.917 0 01-1.335-.363v.032a2.967 2.967 0 002.366 2.902c-.24.066-.502.097-.774.097-.189 0-.38-.01-.56-.05a2.981 2.981 0 002.76 2.057 5.934 5.934 0 01-3.661 1.26c-.242 0-.475-.011-.707-.04a8.314 8.314 0 004.53 1.325c5.435 0 8.406-4.502 8.406-8.404 0-.13-.004-.257-.01-.382a5.89 5.89 0 001.48-1.533z"/></symbol>
<symbol id="icon-twitter" viewBox="0 0 56 56"><path d="M38 21.828c-.707.31-1.46.515-2.244.615a3.874 3.874 0 001.713-2.153 7.783 7.783 0 01-2.47.943 3.894 3.894 0 00-6.738 2.664c0 .308.026.605.09.887a11.025 11.025 0 01-8.028-4.074 3.922 3.922 0 00-.533 1.969 3.9 3.9 0 001.73 3.237 3.847 3.847 0 01-1.76-.48v.043a3.913 3.913 0 003.12 3.827 3.887 3.887 0 01-1.02.129c-.25 0-.502-.015-.738-.067.505 1.543 1.937 2.677 3.64 2.714a7.827 7.827 0 01-4.83 1.66c-.32 0-.626-.013-.932-.052a10.966 10.966 0 005.976 1.748c7.167 0 11.086-5.938 11.086-11.085a9.95 9.95 0 00-.014-.503A7.77 7.77 0 0038 21.828z"/></symbol>
<symbol id="icon-user-circle" viewBox="0 0 24 24"><use xlink:href="#def-user-circle-a" transform="translate(-1244 -22)"/></symbol>
<symbol id="icon-vb" viewBox="0 0 25 27"><use xlink:href="#def-vb-a" transform="translate(-931 -270)"/></symbol>
<symbol id="icon-view-list" viewBox="0 0 15 15"><path d="M0 6V0h15v6zm0 9V9h15v6z"/></symbol>
<symbol id="icon-view-tile" viewBox="0 0 15 15"><path d="M0 6V0h6v6zm9 0V0h6v6zm0 9V9h6v6zm-9 0V9h6v6z"/></symbol>
<symbol id="icon-vk" viewBox="0 0 22 14"><path d="M10.61 13.8h1.3s.39-.04.59-.27c.19-.2.18-.59.18-.59s-.02-1.8.78-2.07c.8-.26 1.82 1.75 2.91 2.52.81.58 1.44.46 1.44.46l2.89-.05s1.52-.09.8-1.33c-.06-.1-.42-.92-2.15-2.59-1.82-1.75-1.58-1.47.61-4.5 1.33-1.84 1.87-2.97 1.7-3.45-.16-.46-1.14-.34-1.14-.34l-3.26.02s-.24-.03-.42.08-.29.36-.29.36-.52 1.43-1.2 2.64c-1.46 2.57-2.04 2.7-2.27 2.54-.56-.37-.42-1.49-.42-2.28 0-2.49.36-3.52-.71-3.79A5.26 5.26 0 0010.43 1c-1.16-.01-2.15.01-2.7.29-.38.19-.66.61-.49.63.22.03.71.14.97.51.33.47.32 1.53.32 1.53s.19 2.92-.45 3.29c-.44.25-1.04-.26-2.34-2.59-.66-1.19-1.16-2.5-1.16-2.5s-.1-.25-.27-.38c-.21-.16-.5-.21-.5-.21l-3.1.02s-.47.01-.64.22c-.15.19-.01.58-.01.58s2.43 5.89 5.17 8.87c2.52 2.72 5.38 2.54 5.38 2.54z"/></symbol>
<symbol id="icon-vk2-mob" viewBox="0 0 34 34"><path fill-rule="evenodd" clip-rule="evenodd" d="M16.79 21.913h.947a.77.77 0 00.436-.201.795.795 0 00.13-.459s-.016-1.399.573-1.608c.588-.209 1.336 1.351 2.13 1.954.297.259.68.383 1.063.346l2.123-.032s1.116-.073.589-1.03a7.642 7.642 0 00-1.582-2.002c-1.337-1.35-1.153-1.134.451-3.473.978-1.424 1.367-2.3 1.245-2.67a.866.866 0 00-.832-.257l-2.4.016a.463.463 0 00-.305.056.702.702 0 00-.214.282 15.134 15.134 0 01-.886 2.042c-1.062 1.978-1.49 2.082-1.665 1.962-.405-.29-.306-1.15-.306-1.77 0-1.913.268-2.717-.511-2.926a4.053 4.053 0 00-1.123-.12 4.804 4.804 0 00-1.987.225c-.275.144-.48.466-.351.49.273.03.524.167.703.386.165.37.246.774.237 1.182 0 0 .145 2.26-.329 2.54-.32.194-.764-.2-1.719-1.993a17.581 17.581 0 01-.848-1.938.803.803 0 00-.198-.29.84.84 0 00-.367-.16l-2.276.016a.723.723 0 00-.466.169.581.581 0 00-.016.442s1.788 4.559 3.805 6.859c.99 1.217 2.427 1.931 3.95 1.962z"/></symbol>
<symbol id="icon-vk2" viewBox="0 0 56 56"><path fill-rule="evenodd" clip-rule="evenodd" d="M28.274 34.074h1.25c.213-.024.413-.117.574-.265.117-.177.177-.39.172-.605 0 0-.02-1.845.755-2.12.776-.276 1.763 1.78 2.811 2.576.391.342.895.506 1.4.456l2.802-.042s1.47-.096.775-1.358a10.079 10.079 0 00-2.085-2.64c-1.763-1.782-1.522-1.495.594-4.582 1.29-1.877 1.804-3.033 1.642-3.52a1.143 1.143 0 00-1.098-.34l-3.163.021a.61.61 0 00-.403.075.925.925 0 00-.282.37 19.972 19.972 0 01-1.17 2.694c-1.4 2.61-1.964 2.747-2.196 2.588-.534-.382-.403-1.516-.403-2.333 0-2.524.353-3.584-.675-3.86a5.345 5.345 0 00-1.48-.16 6.336 6.336 0 00-2.62.298c-.363.19-.635.615-.464.646.36.039.691.221.927.51.218.487.325 1.02.312 1.558 0 0 .192 2.98-.433 3.352-.423.254-1.007-.265-2.267-2.63a23.184 23.184 0 01-1.118-2.556 1.06 1.06 0 00-.262-.382 1.109 1.109 0 00-.484-.212l-3.002.021a.953.953 0 00-.615.223.767.767 0 00-.02.583s2.358 6.013 5.018 9.046c1.305 1.606 3.2 2.548 5.209 2.588z"/></symbol>
<symbol id="icon-yandex" viewBox="0 0 5 11"><path d="M4.847 0H3.259C1.7 0 .376 1.169.376 3.438c0 1.36.64 2.364 1.783 2.86L.028 10.092c-.07.123 0 .22.111.22h.99c.083 0 .139-.028.166-.097L3.231 6.49h.697v3.726c0 .041.041.097.097.097h.864c.083 0 .111-.042.111-.11V.138C5 .04 4.944 0 4.847 0zm-.92 5.61h-.584c-.92 0-1.81-.66-1.81-2.31 0-1.719.835-2.42 1.684-2.42h.71v4.73z" fill-rule="nonzero"/></symbol>
<symbol id="icon-ynadex" viewBox="0 0 5 10"><use xlink:href="#def-ynadex-a" transform="translate(-468 -10321)"/></symbol>
<symbol id="icon-ytube" viewBox="0 0 27 20"><use xlink:href="#def-ytube-a" transform="translate(-1332 -335)"/></symbol>
</svg>
<div class="header-banner topBanner" data-type="header" style="display: block; position: sticky; top: 0; z-index: 999;">
<a data-source="222898" data-banner="226288" class="universal-notice js-universal-notice-notice universal-notice--webp universal-notice--bitrix universal-notice--active" href="https://skillbox.ru/sale/main/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_banners_header_all_all_skillbox" target="_blank" style="--banner-bg: #5927E9;--banner-color: #fff;--button-font-color: #000000;--button-bg-color: #FFFFFF;--banner-img-left: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_left/602754/f9ac17dd-a1d4-46c6-aa14-4f7b949defd1.png);--banner-img-left-webp: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_left/602754/f9ac17dd-a1d4-46c6-aa14-4f7b949defd1.webp);--banner-img-center: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_center/602507/232fc4a5-b130-4af2-a629-bdb293a4dd2e.png);--banner-img-center-webp: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_center/602507/232fc4a5-b130-4af2-a629-bdb293a4dd2e.webp);--banner-img-center-mobile: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_center/602507/232fc4a5-b130-4af2-a629-bdb293a4dd2e.png);--banner-img-center-mobile-webp: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_center/602507/232fc4a5-b130-4af2-a629-bdb293a4dd2e.webp);--banner-img-right: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_right/602755/ad7a7fe5-b8d3-47a3-885b-51a7971c12a9.png);--banner-img-right-webp: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_right/602755/ad7a7fe5-b8d3-47a3-885b-51a7971c12a9.webp);">
<span class="universal-notice__wrapper">
<b class="universal-notice__title">
Скидка до 55% и 3 курса в подарок
</b>
<span class="universal-timer js-universal-notice-timer js-universal-notice-active">
<span class="universal-timer__days js-universal-notice-days">2 дня</span>
<span class="js-universal-notice-hours">13</span>
:<span class="js-universal-notice-minutes">30</span>
:<span class="js-universal-notice-seconds">09</span>
</span>
<span class="universal-notice__button">Выбрать курс</span>
</span>
</a><script>
document.addEventListener('DOMContentLoaded', () => {
// Установите конечную дату
const deadline = new Date();
deadline.setDate(5);
deadline.setHours(0, 0, 0);
// Найдите элементы DOM
var timer = document.querySelector('.universal-timer');
const elDays = timer.querySelector('.js-universal-notice-days');
const elHours = timer.querySelector('.js-universal-notice-hours');
const elMinutes = timer.querySelector('.js-universal-notice-minutes');
const elSeconds = timer.querySelector('.js-universal-notice-seconds');
// Функция обновления таймера
const updateTimer = () => {
const now = new Date();
let diff = Math.max(0, deadline - now);
if (diff === 0) {
let lastDayOfMonth = new Date(now.getFullYear(), now.getMonth() + 1, 0);
let lastDay = lastDayOfMonth.getDate();
if (lastDay - now.getDate() < 4) {
deadline.setMonth(deadline.getMonth() + 1, 1);
} else {
deadline.setDate(deadline.getDate() + 4);
}
diff = Math.max(0, deadline - now);
}
// Time calculations for days, hours, minutes and seconds
var days = Math.floor(diff / (1000 * 60 * 60 * 24));
var hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)).toString();
var minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)).toString();
var seconds = Math.floor((diff % (1000 * 60)) / 1000).toString();
if (timer) {
let dayTitles = ['день', 'дня', 'дней'];
let daySuffix = dayTitles[(days % 100 > 4 && days % 100 < 20) ? 2 : [2, 0, 1, 1, 1, 2][days % 10 < 5 ? days % 10 : 5]]
elDays.innerHTML = days + ' ' + daySuffix;
elHours.innerHTML = hours.padStart(2, '0');
elMinutes.innerHTML = minutes.padStart(2, '0');
elSeconds.innerHTML = seconds.padStart(2, '0');
}
};
updateTimer();
const timerId = setInterval(updateTimer, 1000);
});
</script>
<style>@font-face{font-display:swap;font-family:Graphik;font-weight:500;font-style:normal;src:url(https://248006.selcdn.ru/Shared/fonts/GraphikLCTT-VA-Medium.woff2) format("woff2")}@font-face{font-display:swap;font-family:Graphik;font-weight:700;font-style:normal;src:url(https://248006.selcdn.ru/Shared/fonts/GraphikLCTT-VA-Bold.woff2) format("woff2")}.universal-notice{position:sticky;z-index:5;top:0;box-sizing:border-box;text-decoration:none;display:none;justify-content:space-between;overflow:hidden;color:var(--banner-color);background-color:var(--banner-bg);font-family:Graphik,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transition:opacity .25s ease-in-out}.universal-notice--active{display:flex}.universal-notice--bitrix{z-index:1000}.universal-notice *,.universal-notice ::after,.universal-notice ::before{box-sizing:inherit}.universal-notice::after,.universal-notice::before{display:none;width:194px;height:56px;content:"";background-size:194px 56px;background-repeat:no-repeat}.universal-notice--no-webp::before{background-image:var(--banner-img-left)}.universal-notice--no-webp::after{background-image:var(--banner-img-right)}.universal-notice--webp::before{background-image:var(--banner-img-left-webp)}.universal-notice--webp::after{background-image:var(--banner-img-right-webp)}.universal-notice--new-design{position:static;margin:4px;border-radius:16px}.universal-notice--new-design::after,.universal-notice--new-design::before{width:166px;height:48px;background-size:166px 48px}.universal-notice__wrapper{display:grid;grid-template-columns:1fr auto;align-items:center;grid-gap:12px;padding:12px;width:100%}.universal-notice--new-design .universal-notice__wrapper::after{height:48px}.universal-notice__title{font-weight:500;font-size:15px;line-height:16px}.universal-notice--new-design .universal-notice__title{font-size:14px;line-height:15px}.universal-timer{display:none;font-feature-settings:"tnum";font-variant-numeric:tabular-nums;font-weight:500;font-size:24px;line-height:26px}.universal-notice--new-design .universal-timer{font-size:22px;line-height:24px}.universal-timer__days{margin-right:8px}.universal-notice__button{grid-column:2/3;padding:6px 16px;border-radius:6px;color:var(--button-font-color);background-color:var(--button-bg-color);font-weight:500;font-size:14px;line-height:20px}.universal-notice-sticky{position:fixed;z-index:5;top:0;left:0;width:100%;padding:11px 8px;color:var(--banner-color);background-color:var(--banner-bg);text-align:center;transition:transform .3s ease-in-out;will-change:transform;transform:translateY(-200%)}.universal-notice-sticky--show{transform:translateY(0)}@media (min-width:360px) and (max-width:0px){.universal-notice__wrapper{padding:0 12px;grid-template-columns:1fr 56px auto}.universal-notice__wrapper::after{grid-column:2/3;grid-row:1/2;width:100%;height:56px;background-size:cover;background-repeat:no-repeat;content:""}.universal-notice--new-design .universal-notice__wrapper{grid-template-columns:1fr 48px auto}.universal-notice--no-webp .universal-notice__wrapper::after{background-image:var(--banner-img-center-mobile)}.universal-notice--webp .universal-notice__wrapper::after{background-image:var(--banner-img-center-mobile-webp)}.universal-notice__button{grid-column:3/4}}@media (min-width:360px){.universal-notice__wrapper{padding:0 12px;grid-template-columns:1fr 56px auto}.universal-notice__wrapper::after{grid-column:2/3;grid-row:1/2;width:100%;height:56px;background-size:cover;background-repeat:no-repeat;content:""}.universal-notice--new-design .universal-notice__wrapper{grid-template-columns:1fr 48px auto}.universal-notice--no-webp .universal-notice__wrapper::after{background-image:var(--banner-img-center-mobile)}.universal-notice--webp .universal-notice__wrapper::after{background-image:var(--banner-img-center-mobile-webp)}.universal-notice__button{grid-column:3/4}}@media (min-width:768px){.universal-notice::before{background-position:right center;flex-shrink:0;display:block}.universal-notice--no-webp .universal-notice__wrapper::after{background-image:var(--banner-img-center)}.universal-notice--webp .universal-notice__wrapper::after{background-image:var(--banner-img-center-webp)}}@media (min-width:768px) and (max-width:0px){.universal-notice::before{background-position:right center;flex-shrink:0;display:block}.universal-notice--no-webp .universal-notice__wrapper::after{background-image:var(--banner-img-center)}.universal-notice--webp .universal-notice__wrapper::after{background-image:var(--banner-img-center-webp)}}@media (min-width:1024px){.universal-notice::after,.universal-notice::before{width:250px;height:72px;background-size:250px 72px}.universal-notice--new-design{height:64px;border-radius:32px}.universal-notice--new-design::after,.universal-notice--new-design::before{width:226px;height:64px;background-size:226px 64px}.universal-notice__wrapper{grid-template-columns:1fr 72px auto;grid-gap:24px;padding-right:16px;padding-left:24px}.universal-notice__wrapper::after{height:72px}.universal-notice--new-design .universal-notice__wrapper{grid-template-columns:1fr 64px auto}.universal-notice--new-design .universal-notice__wrapper::after{height:64px}.universal-notice__title{font-size:24px;line-height:26px}.universal-notice--new-design .universal-notice__title{font-size:22px;line-height:24px}.universal-notice__button{padding:10px 24px;border-radius:8px}.universal-notice-sticky{padding:14px 24px}}@media (min-width:1024px) and (max-width:0px){.universal-notice::after,.universal-notice::before{width:250px;height:72px;background-size:250px 72px}.universal-notice--new-design{height:64px;border-radius:32px}.universal-notice--new-design::after,.universal-notice--new-design::before{width:226px;height:64px;background-size:226px 64px}.universal-notice__wrapper{grid-template-columns:1fr 72px auto;grid-gap:24px;padding-right:16px;padding-left:24px}.universal-notice__wrapper::after{height:72px}.universal-notice--new-design .universal-notice__wrapper{grid-template-columns:1fr 64px auto}.universal-notice--new-design .universal-notice__wrapper::after{height:64px}.universal-notice__title{font-size:24px;line-height:26px}.universal-notice--new-design .universal-notice__title{font-size:22px;line-height:24px}.universal-notice__button{padding:10px 24px;border-radius:8px}.universal-notice-sticky{padding:14px 24px}}@media (min-width:1280px){.universal-notice::before{flex-shrink:1}.universal-notice::after{background-position:left center;display:block}.universal-notice__wrapper{grid-template-columns:1fr 72px minmax(202px,auto) auto;min-width:940px;max-width:1020px;padding-right:24px}.universal-notice--new-design .universal-notice__wrapper{grid-template-columns:1fr 64px minmax(202px,auto) auto}.universal-timer.js-universal-notice-active{display:flex}.universal-notice__timer-nuxt{display:flex}.universal-notice__button{grid-column:4/5}}@media (min-width:1280px) and (max-width:0px){.universal-notice::before{flex-shrink:1}.universal-notice::after{background-position:left center;display:block}.universal-notice__wrapper{grid-template-columns:1fr 72px minmax(202px,auto) auto;min-width:940px;max-width:1020px;padding-right:24px}.universal-notice--new-design .universal-notice__wrapper{grid-template-columns:1fr 64px minmax(202px,auto) auto}.universal-timer.js-universal-notice-active{display:flex}.universal-notice__timer-nuxt{display:flex}.universal-notice__button{grid-column:4/5}}@media (min-width:1400px) and (max-width:0px){.universal-notice::before{flex-shrink:0}.universal-notice::after{flex-shrink:0}}@media (min-width:1400px){.universal-notice::before{flex-shrink:0}.universal-notice::after{flex-shrink:0}}</style> </div>
<script>
document.addEventListener("DOMContentLoaded", function(event) {
window.TopBanner = true;
});
$(document).ready(function () {
$.ajax({
url: '/local/ajax/advert.php',
type: 'POST',
data: {
'type': 'top-banner-show',
'id': 226288,
'section_id': 0,
},
success: function (result) {
}
});
});
$(document).on('click', '.header-banner', function () {
$.ajax({
url: '/local/ajax/advert.php',
type: 'POST',
data: {
'type': 'top-banner-click',
'id': 226288,
'section_id': 0,
},
success: function (result) {
}
});
var page = window.location;
var $article = $('section[data-article-text]');
var pageId = $article.data('articleid');
if(pageId === undefined)
{
pageId = 0;
}
window.dataLayer.push({
'event': 'go_to_course',
'courseID': 226288,
'page': page,
'pageID': pageId
});
});
</script>
<header class="header">
<div id="menu" class="header__wrapper container">
<div class="header__logo link-active">
<a href="/media/" class="header__media-main-link">
<img src="/local/templates/media/images/logo/skillbox-media.svg" alt="Skillbox"/>
</a>
<a href="/media/code/" class="header__media-category-link">
<span class="header__media-category js-category ">Код</span>
</a>
</div>
<a href="/media/about-media/" v-if="!isMobile" rel="nofollow" class="menu-nav__link menu-nav__link--about" target="_blank" style="display: none">
Про медиа
</a>
<button v-if="!isMobile" v-show="!isMobile" rel="nofollow" class="toggle-menu header__toggle toggle-menu--course"
@click="openCourseMenu()"
:class="{ 'toggle-menu--active': isOpenCourseMenu }"
style="display: none">
Онлайн-курсы
<svg width="13" height="12" viewBox="0 0 13 12" fill="none" xmlns="http://www.w3.org/2000/svg"
:class="{
'animated-chevron--default': isOpenCourseMenu,
'animated-chevron--active animated-chevron--default': ! isOpenCourseMenu
}"
class="animated-chevron toggle-menu__arrow select-arrow select-arrow--small">
<line x1="6.48415" y1="5.92242" x2="11.4909" y2="10.9291" stroke="currentColor" stroke-width="1.78"
class=" animated-chevron__line animated-chevron__line1 animated-chevron__line1--default"></line>
<line x1="6.3701" y1="5.9224" x2="11.3768" y2="0.915678" stroke="currentColor" stroke-width="1.78"
class="animated-chevron__line"></line>
<line x1="1.36337" y1="10.9291" x2="6.3701" y2="5.9224" stroke="currentColor" stroke-width="1.78"
class="animated-chevron__line animated-chevron__line2 animated-chevron__line2--default"></line>
<line x1="1.47743" y1="0.915681" x2="6.48415" y2="5.9224" stroke="currentColor" stroke-width="1.78"
class="animated-chevron__line"></line>
</svg>
</button>
<a href="https://skillbox.ru/?utm_source=media&utm_medium=button&utm_campaign=button_main_skillbox&utm_term=mainskillbox" v-if="!isMobile" v-show="!isMobile" rel="nofollow" class="menu-nav__link menu-nav__link-ml0 menu-nav__link--main" target="_blank" style="display: none">
Главная Skillbox
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3.9375 10.0618L9.9161 4.08203" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M3.93811 3.93665H10.0631V10.0616" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
<div v-if="isOpenCourseMenu && !isMobile" class="menu-block menu-block--desktop" @click="closeCourseMenu($event)" style="display: none">
<div class="menu-block__wrapper menu-block__wrapper--desktop">
<div class="menu-block__content vue-container">
<span class="menu-block__title">
Направления обучения
</span>
<ul class="menu-directions menu-block__direction">
<li class="menu-directions__item">
<a href="https://skillbox.ru/courses/?utm_source=media&utm_medium=button&utm_campaign=button_courses_all&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="All directions">
Все направления
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/code/?utm_source=media&utm_medium=button&utm_campaign=button_courses_code&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Code">
Программирование
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/design/?utm_source=media&utm_medium=button&utm_campaign=button_courses_design&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Design">
Дизайн
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/management?utm_source=media&utm_medium=button&utm_campaign=button_courses_management&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Management">
Управление
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/marketing?utm_source=media&utm_medium=button&utm_campaign=button_courses_marketing&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Marketing">
Маркетинг
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/games?utm_source=media&utm_medium=button&utm_campaign=button_courses_games&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="GameDev">
Игры
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/multimedia?utm_source=media&utm_medium=button&utm_campaign=button_courses_multimedia&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="">
Кино и Музыка
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/psychology?utm_source=media&utm_medium=button&utm_campaign=button_courses_psychology&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Development">
Психология
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/health?utm_source=media&utm_medium=button&utm_campaign=button_courses_health&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Development">
Здоровье
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/spo/?utm_source=media&utm_medium=button&utm_campaign=button_courses_spo&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Development">
Цифровой колледж
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/general-development/?utm_source=media&utm_medium=button&utm_campaign=button_courses_general-development&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Education">
Общее развитие
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/engineering/?utm_source=media&utm_medium=button&utm_campaign=button_courses_engineering&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="engineering">
Инженерия
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/english/?utm_source=media&utm_medium=button&utm_campaign=button_courses_english&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="english">
Английский язык
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/other/?utm_source=media&utm_medium=button&utm_campaign=button_courses_other&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Other">
Другое
</a>
</li>
</ul>
</div>
</div>
</div>
<div v-show="isOpenMenu" class="menu-block" @click="closeMenu($event)" style="display: none">
<div class="menu-block__wrapper">
<div class="menu-block__content vue-container">
<h2 class="menu-block__header">Редакции</h2>
<div class="tab-nav" data-tab-parent="" data-action="index">
<div class="tab-nav__item">
<a class="" data-tab-name="media_nav" data-section-id="0" data-code="All directions" href="/media/">
<img src="/local/templates/media/images/common/menu-icon-mobile-1.png" alt=""/>
Все
</a>
</div>
<div class="tab-nav__item tab-nav__item--custom tab-nav__item--spec"
data-nav-parent-item>
<a
data-tab-name="media_nav"
data-code=""
href="/media/topic/history/">
<img src="/local/templates/media/images/common/menu-icon-mobile-19.png"
alt=""/>
Истории</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="8"
data-code="Design"
href="/media/design/">
<img src="/local/templates/media/images/common/menu-icon-mobile-2.png" alt=""/>
Дизайн</a>
</div>
<div class="tab-nav__item">
<a class="tab-active"
data-tab-name="media_nav"
data-section-id="10"
data-code="Code"
href="/media/code/">
<img src="/local/templates/media/images/common/menu-icon-mobile-3.png" alt=""/>
Код</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="18"
data-code="GameDev"
href="/media/gamedev/">
<img src="/local/templates/media/images/common/menu-icon-mobile-4.png" alt=""/>
Геймдев</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="21"
data-code="Business"
href="/media/business/">
<img src="/local/templates/media/images/common/menu-icon-mobile-9.png" alt=""/>
Бизнес</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="9"
data-code="Marketing"
href="/media/marketing/">
<img src="/local/templates/media/images/common/menu-icon-mobile-5.png" alt=""/>
Маркетинг</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="11"
data-code=""
href="/media/management/">
<img src="/local/templates/media/images/common/menu-icon-mobile-6.png" alt=""/>
Управление</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="29"
data-code=""
href="/media/cinemusic/">
<img src="/local/templates/media/images/common/menu-icon-mobile-22.png" alt=""/>
Кино</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="36"
data-code=""
href="/media/music/">
<img src="/local/templates/media/images/common/menu-icon-mobile-23.png" alt=""/>
Музыка</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="34"
data-code=""
href="/media/photo/">
<img src="/local/templates/media/images/common/menu-icon-mobile-20.png" alt=""/>
Проектная фотография</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="17"
data-code="Development"
href="/media/growth/">
<img src="/local/templates/media/images/common/menu-icon-mobile-7.png" alt=""/>
Развитие</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="33"
data-code=""
href="/media/health/">
<img src="/local/templates/media/images/common/menu-icon-mobile-16.png" alt=""/>
Здоровье</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="32"
data-code=""
href="/media/money/">
<img src="/local/templates/media/images/common/menu-icon-mobile-17.png" alt=""/>
Деньги</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="22"
data-code="Education"
href="/media/education/">
<img src="/local/templates/media/images/common/menu-icon-mobile-8.png" alt=""/>
Образование</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="31"
data-code=""
href="/media/edtech/">
<img src="/local/templates/media/images/common/menu-icon-mobile-11.png" alt=""/>
EdTech</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="30"
data-code=""
href="/media/corptrain/">
<img src="/local/templates/media/images/common/menu-icon-mobile-10.png" alt=""/>
Корп. обучение</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="35"
data-code=""
href="/media/skillbox-blog/">
<img src="/local/templates/media/images/common/menu-icon-mobile-21.png" alt=""/>
Блог Skillbox</a>
</div>
<div class="tab-nav__item tab-nav__item--custom tab-nav__item--spec"
data-nav-parent-item>
<a
data-tab-name="media_nav"
data-code=""
href="https://skillbox.ru/media/glossary/">
<img src="/local/templates/media/images/common/menu-icon-mobile-18.png"
alt=""/>
Глоссарий</a>
</div>
<div class="tab-nav__item tab-nav__item--custom tab-nav__item--spec"
data-nav-parent-item>
<a
data-tab-name="media_nav"
data-code=""
href="/media/topic/specials/">
<img src="/local/templates/media/images/common/menu-icon-mobile-13.png"
alt=""/>
Спецпроекты</a>
</div>
<div class="tab-nav__item tab-nav__item--custom tab-nav__item--spec"
data-nav-parent-item>
<a
data-tab-name="media_nav"
data-code=""
href="https://skillbox.ru/course/career-guide-free/">
<img src="/local/templates/media/images/common/menu-icon-mobile-15.png"
alt=""/>
Профориентация</a>
</div>
</div>
<h2 class="menu-block__header">Онлайн-курсы</h2>
<ul class="menu-directions menu-block__direction">
<li class="menu-directions__item">
<a href="https://skillbox.ru/courses/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="All directions">
Все направления
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/code/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Code">
Программирование
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/design/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Design">
Дизайн
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/marketing/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Marketing">
Маркетинг
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/management/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Management">
Управление
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/games/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="GameDev">
Игры
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/multimedia/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="">
Мультимедиа
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/psychology/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Development">
Психология
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/general-development/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Education">
Общее развитие
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/engineering/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="engineering">
Инженерия
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/english/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="english">
Английский язык
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/other/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Other">
Другое
</a>
</li>
</ul>
<a href="/media/about-media/" rel="nofollow" class="menu-nav__link">
Про медиа
</a>
<a href="https://skillbox.ru/" rel="nofollow" class="menu-nav__link">
Главная Skillbox
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3.9375 10.0618L9.9161 4.08203" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M3.93811 3.93665H10.0631V10.0616" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
</div>
</div>
</div>
<button v-if="isMobile" class="menu-toggle"
@click="openMenu()"
:class="{ 'menu-toggle--opened': isOpenMenu }" style="opacity: 0">
<span v-if="isOpenMenu" class="menu-toggle__line"></span>
<svg v-if="!isOpenMenu" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24 5.5H0V4H24V5.5ZM24 11.5H0V13H24V11.5ZM24 19H0V20.5H24V19Z" fill="black"/>
</svg>
</button>
</div>
<script>
BX.Vue.create({
el: '#menu',
data: {
isOpenMenu: false,
isOpenCourseMenu: false,
isMobile: false,
isSubOpen: false,
display: 'none'
},
computed: {
isMobile() {
const w = window.innerWidth
|| document.documentElement.clientWidth
|| document.body.clientWidth;
return w < 1024;
}
},
methods: {
openMenu() {
this.isOpenMenu = !this.isOpenMenu;
document.getElementsByTagName('body')[0].classList.toggle('scroll-locked');
window.addEventListener('keyup', this.closeMenu);
},
closeMenu(event) {
if (event.target.classList.contains('menu-block') || event.keyCode === 27) {
this.isOpenMenu = false;
document.getElementsByTagName('body')[0].classList.remove('scroll-locked');
window.removeEventListener('keyup', this.closeMenu);
}
},
openCourseMenu() {
this.isOpenCourseMenu = !this.isOpenCourseMenu;
if (this.isOpenCourseMenu) {
document.getElementsByTagName('body')[0].classList.add('scroll-locked');
window.addEventListener('keyup', this.closeCourseMenu);
} else {
document.getElementsByTagName('body')[0].classList.remove('scroll-locked');
window.removeEventListener('keyup', this.closeCourseMenu);
}
},
closeCourseMenu(event) {
if (event.target.classList.contains('menu-block') || event.keyCode === 27) {
this.isOpenCourseMenu = false;
document.getElementsByTagName('body')[0].classList.remove('scroll-locked');
window.removeEventListener('keyup', this.closeCourseMenu);
}
},
openSub() {
this.isSubOpen = !this.isSubOpen;
},
isMobileFn() {
const w = window.innerWidth
|| document.documentElement.clientWidth
|| document.body.clientWidth;
this.isMobile = (w < 1024);
}
},
created() {
window.addEventListener("resize", this.isMobileFn);
document.querySelector('.menu-block').style.display = '';
document.querySelector('.menu-toggle').style.opacity = '1';
document.querySelector('.menu-nav__link').style.display = '';
this.display = 'block';
this.isMobileFn();
},
destroyed() {
window.removeEventListener("resize", this.isMobileFn);
}
});
</script>
</header>
<main class="content">
<div class="page style-update">
<div class="page-wrap">
<style>
.article-inner .rr-widget__title {
padding-top: 0 !important;
}
.article-inner div[data-retailrocket-markup-block] {
margin-top: -32px;
display: none;
}
.article-inner {
font-family: 'Graphik';
}
</style>
<div class="under_header_banner" data-type="under_header"><!-- Yandex.RTB R-A-13443663-10 -->
<div id="yandex_rtb_R-A-13443663-10"></div>
<script>
window.yaContextCb.push(() => {
Ya.Context.AdvManager.render({
"blockId": "R-A-13443663-10",
"renderTo": "yandex_rtb_R-A-13443663-10"
})
})
</script>
</div> <div data-area="article" data-title="Основные паттерны проектирования: обзор с примерами на Java / Skillbox Media" class=" noFullClass">
<div class="article-inner">
<section class="top-section-detail-page ">
<div class="container">
<div class="article-preview-info">
<div class="article-preview-info__tags ">
<div class="tag article-preview-info__tag">
<a href="/media/code/"
class="tag-item programming">
Код </a>
</div>
</div>
<a class="info-hashtag article-preview-info__hashtag" href="/media/topic/articles/">
#статьи </a>
<ul class="info article-preview__info-box">
<li class="info-item"> <time class="info-text" datatime="#">17 мар 2025</time></li>
<li class="info-item hidden">
<span class="info-icon"><img src="/local/templates/media/images/icons/like.svg" alt=""></span>
<span class="info__text js-article-like-value">0</span>
</li>
</ul>
</div>
<div class="row">
<div class="top-section-detail-page__title-block col-xl-9 col-lg-10">
<div class="article-preview">
<h1 class="article-preview__title">Основные паттерны проектирования на Java</h1>
<p class="article-preview__description">Простое введение в тему для новичков с примерами кода.</p>
</div>
</div>
</div>
</div>
</section>
<section data-article-text
data-articleId="222898"
data-courseId="3869"
>
<div class="container">
<noindex>
<div class="share" data-nosnippet>
<button class="share__handler-btn ">
<span class="share__handler-icon">
<svg width="11" height="12" viewBox="0 0 11 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11 4.99902L6 0V2.99805C2.688 2.99805 0 5.68505 0 8.99805V11.498H0.0980225C0.765022 8.91205 3.107 6.99805 5.901 6.99805H6.00098V9.99805L11 4.99902Z" fill="currentColor"/>
</svg>
</span>
<span class="share__handler-text">Поделиться</span>
</button>
<div class="share__list">
<a href="#" class="share__item" data-code="vk">
<span class="share__item-icon share__item-icon--vk">
<svg width="9" height="5" viewBox="0 0 9 5" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M4.04776 4.98054H4.53996C4.62377 4.97136 4.70279 4.9361 4.76621 4.87951C4.81226 4.81209 4.83594 4.73139 4.83369 4.64925C4.83369 4.64925 4.82574 3.94629 5.1314 3.84125C5.43701 3.73621 5.826 4.51998 6.23879 4.82297C6.39281 4.95308 6.59128 5.01558 6.79053 4.99669L7.89399 4.98054C7.89399 4.98054 8.47355 4.94415 8.19965 4.46339C7.98372 4.08315 7.70589 3.743 7.37799 3.45744C6.68338 2.77872 6.77865 2.8878 7.61219 1.71216C8.12024 0.997077 8.32269 0.556717 8.25918 0.370875C8.14651 0.254767 7.98299 0.205914 7.82655 0.241594L6.58018 0.249674C6.52565 0.241067 6.46984 0.251007 6.42141 0.277954C6.37298 0.314507 6.33466 0.363228 6.31025 0.419356C6.18259 0.772814 6.0287 1.11586 5.8498 1.44552C5.29807 2.43936 5.07579 2.49188 4.98451 2.43128C4.77416 2.28584 4.82574 1.85356 4.82574 1.54248C4.82574 0.580957 4.96468 0.176954 4.55979 0.0719133C4.36879 0.0254376 4.17259 0.00505841 3.97631 0.0113129C3.62834 -0.0214164 3.27745 0.017045 2.94429 0.124433C2.8014 0.197154 2.69423 0.358753 2.76171 0.370875C2.90334 0.385518 3.03406 0.454932 3.12688 0.564795C3.21268 0.750336 3.25481 0.953675 3.24993 1.15868C3.24993 1.15868 3.32535 2.29392 3.07925 2.43532C2.91254 2.53228 2.68232 2.33432 2.18616 1.4334C2.01958 1.11848 1.87243 0.793298 1.74557 0.459754C1.72231 0.404013 1.68704 0.354309 1.64236 0.314316C1.58589 0.272672 1.52066 0.245006 1.45184 0.233514L0.268986 0.241594C0.181167 0.241154 0.0958013 0.271066 0.0268587 0.326434C-0.00595087 0.396174 -0.00882613 0.476652 0.0189202 0.548633C0.0189202 0.548633 0.947737 2.83932 1.99563 3.99477C2.51 4.60651 3.2568 4.96526 4.04776 4.98054Z" fill="white"/>
</svg>
</span>
<span class="share__item-text">Vkontakte</span>
</a>
<a href="#" class="share__item" data-code="tw">
<span class="share__item-icon share__item-icon--tw">
<svg width="9" height="7" viewBox="0 0 9 7" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.52788 0.00144284V0H5.9158L6.05754 0.027414C6.15204 0.0452114 6.23783 0.068535 6.31491 0.0973918C6.39201 0.126249 6.46661 0.159917 6.53872 0.198391C6.61083 0.236864 6.67623 0.276066 6.73492 0.315982C6.79311 0.355422 6.84533 0.397265 6.89158 0.441509C6.93733 0.486237 7.0087 0.49778 7.10568 0.476138C7.20266 0.454495 7.3071 0.424433 7.419 0.38596C7.5309 0.347487 7.64156 0.304201 7.75097 0.256104C7.86039 0.208007 7.92703 0.177469 7.95091 0.164484C7.97428 0.151022 7.98671 0.143808 7.98821 0.142841L7.98969 0.140677L7.99715 0.13707L8.00461 0.133463L8.01207 0.129856L8.01953 0.126249L8.02102 0.124084L8.02326 0.122642L8.02551 0.121199L8.02699 0.119034L8.03445 0.11687L8.04191 0.115427L8.04043 0.126249L8.03818 0.13707L8.03445 0.147891L8.03072 0.158713L8.02699 0.165927L8.02326 0.173141L8.01953 0.183962C8.01705 0.191176 8.01456 0.200793 8.01207 0.212819C8.00959 0.224845 7.98596 0.272935 7.9412 0.357103C7.89644 0.441271 7.84049 0.526637 7.77335 0.613208C7.70621 0.699778 7.64604 0.765182 7.59283 0.809434C7.53911 0.854162 7.50355 0.885421 7.48614 0.903219C7.46874 0.921492 7.4476 0.938323 7.42273 0.953718L7.38543 0.977525L7.37797 0.981132L7.37051 0.984739L7.36902 0.986903L7.36678 0.988346L7.36454 0.989789L7.36305 0.991953L7.35559 0.99556L7.34813 0.999168L7.34664 1.00133L7.3444 1.00277L7.34216 1.00422L7.34067 1.00638L7.33918 1.00855L7.33694 1.00999L7.3347 1.01143L7.33321 1.0136H7.37051L7.57939 0.970311C7.71865 0.941454 7.85168 0.906588 7.9785 0.865705L8.17992 0.800777L8.2023 0.793563L8.21349 0.789956L8.22095 0.786348L8.22841 0.782741L8.23587 0.779134L8.24333 0.775527L8.25825 0.773363L8.27317 0.77192V0.786348L8.26944 0.787791L8.26571 0.789956L8.26423 0.79212L8.26198 0.793563L8.25974 0.795006L8.25825 0.79717L8.25677 0.799334L8.25452 0.800777L8.25228 0.80222L8.25079 0.804384L8.24931 0.806548L8.24706 0.807991L8.24333 0.815205L8.2396 0.82242L8.23736 0.823862C8.23637 0.825305 8.20479 0.866181 8.14262 0.946504C8.08046 1.0273 8.04689 1.06818 8.04191 1.06915C8.03694 1.07059 8.02997 1.0778 8.02102 1.09079C8.01257 1.10425 7.95985 1.15788 7.86287 1.25166C7.76589 1.34545 7.67091 1.42889 7.57791 1.502C7.48441 1.57558 7.43716 1.666 7.43616 1.77325C7.43467 1.88002 7.42895 2.00074 7.419 2.13541C7.40905 2.27007 7.3904 2.41555 7.36305 2.57186C7.3357 2.72817 7.29342 2.90492 7.23623 3.10211C7.17904 3.29929 7.10941 3.49168 7.02735 3.67925C6.94529 3.86681 6.8595 4.03514 6.76998 4.18424C6.68046 4.33334 6.5984 4.45958 6.5238 4.56299C6.4492 4.66639 6.37336 4.76378 6.29626 4.85516C6.21918 4.94654 6.12171 5.04947 6.00384 5.16393C5.88547 5.27791 5.82082 5.34044 5.80988 5.3515C5.79844 5.36208 5.74971 5.40152 5.66365 5.46981C5.57812 5.53858 5.48611 5.60736 5.38763 5.67614C5.28966 5.74443 5.19964 5.80143 5.11758 5.84711C5.03552 5.8928 4.93655 5.94498 4.82067 6.00366C4.70529 6.06282 4.58046 6.11765 4.44618 6.16815C4.3119 6.21865 4.17016 6.26554 4.02096 6.30882C3.87176 6.35211 3.72753 6.38578 3.58827 6.40982C3.44903 6.43387 3.29112 6.45431 3.11456 6.47114L2.84973 6.49639V6.5H2.36483V6.49639L2.30142 6.49279C2.25915 6.49038 2.22433 6.48797 2.19698 6.48557C2.16963 6.48317 2.06643 6.46994 1.88739 6.44589C1.70835 6.42185 1.56785 6.3978 1.4659 6.37375C1.36395 6.34971 1.21225 6.30401 1.01083 6.23668C0.809413 6.16935 0.637087 6.10129 0.493854 6.03252C0.351121 5.96422 0.261601 5.92094 0.225293 5.90266C0.189485 5.88487 0.149201 5.86275 0.10444 5.83629L0.0373001 5.79661L0.0358156 5.79445L0.0335701 5.79301L0.0313321 5.79156L0.0298401 5.7894L0.0223801 5.78579L0.0149201 5.78219L0.0134355 5.78002L0.01119 5.77858L0.00895204 5.77714L0.00746003 5.77497L0.00597548 5.77281L0.00373001 5.77137H0V5.75694L0.00746003 5.75838L0.0149201 5.76054L0.0484902 5.76415C0.0708703 5.76655 0.131796 5.77016 0.231261 5.77497C0.330733 5.77978 0.436412 5.77978 0.548312 5.77497C0.660213 5.77016 0.774605 5.75934 0.891474 5.74251C1.00835 5.72568 1.14636 5.69682 1.30551 5.65594C1.46466 5.61505 1.61087 5.56648 1.74416 5.51021C1.87695 5.45346 1.97144 5.41114 2.02764 5.38324C2.08334 5.35583 2.16838 5.30484 2.28277 5.2303L2.45435 5.11848L2.45584 5.11632L2.45808 5.11487L2.46033 5.11343L2.46181 5.11127L2.4633 5.1091L2.46554 5.10766L2.46779 5.10622L2.46927 5.10405L2.47673 5.10189L2.48419 5.10044L2.48568 5.09323L2.48792 5.08602L2.49017 5.08457L2.49165 5.08241L2.43197 5.0788C2.39219 5.0764 2.35364 5.07399 2.31634 5.07159C2.27904 5.06918 2.2206 5.05836 2.14103 5.03912C2.06146 5.01988 1.97567 4.99103 1.88366 4.95255C1.79165 4.91408 1.70213 4.86838 1.6151 4.81548C1.52807 4.76258 1.46515 4.71857 1.42636 4.68346C1.38807 4.64883 1.33833 4.59978 1.27716 4.53629C1.21648 4.47233 1.16376 4.40668 1.119 4.33934C1.07424 4.27202 1.03148 4.19433 0.990699 4.10633L0.928774 3.97503L0.925044 3.96421L0.921314 3.95339L0.919076 3.94617L0.917584 3.93896L0.928774 3.9404L0.939964 3.94256L1.02202 3.95339C1.07674 3.9606 1.16253 3.963 1.27939 3.9606C1.39627 3.9582 1.47709 3.95339 1.52185 3.94617C1.56661 3.93896 1.59396 3.93414 1.60391 3.93174L1.61883 3.92814L1.63748 3.92453L1.65613 3.92092L1.65762 3.91876L1.65986 3.91731L1.6621 3.91587L1.66359 3.91371L1.64867 3.9101L1.63375 3.90649L1.61883 3.90289L1.60391 3.89928L1.58899 3.89567C1.57904 3.89327 1.56164 3.88846 1.53677 3.88124C1.5119 3.87403 1.44476 3.84757 1.33535 3.80189C1.22594 3.7562 1.1389 3.71171 1.07424 3.66842C1.00943 3.62501 0.947626 3.57754 0.889235 3.5263C0.831047 3.47436 0.767145 3.40751 0.697513 3.32575C0.627888 3.24399 0.565724 3.149 0.511012 3.04079C0.456308 2.93257 0.415277 2.82917 0.387922 2.73058C0.360676 2.63256 0.3427 2.53235 0.334217 2.43119L0.320781 2.27969L0.328241 2.28113L0.335701 2.2833L0.343161 2.2869L0.350621 2.29051L0.358081 2.29412L0.365541 2.29772L0.481172 2.34822C0.558264 2.38189 0.653998 2.41075 0.768383 2.43479C0.882775 2.45884 0.951154 2.47207 0.973534 2.47447L1.0071 2.47808H1.07424L1.07276 2.47592L1.07051 2.47447L1.06828 2.47303L1.06678 2.47087L1.0653 2.4687L1.06305 2.46726L1.06082 2.46582L1.05932 2.46365L1.05186 2.46004L1.0444 2.45644L1.04292 2.45427L1.04067 2.45283L1.03844 2.45139L1.03694 2.44922L1.02948 2.44562L1.02202 2.44201L1.02054 2.43984C1.01905 2.43888 0.99766 2.42349 0.956376 2.39367C0.915592 2.36337 0.872823 2.32418 0.828063 2.27608C0.783303 2.22798 0.738543 2.17749 0.693783 2.12458C0.64894 2.07156 0.609 2.01483 0.574422 1.95505C0.539614 1.89493 0.502806 1.81846 0.464014 1.72564C0.425721 1.6333 0.396627 1.54023 0.376731 1.44645C0.356843 1.35266 0.345653 1.26008 0.343161 1.1687C0.340677 1.07732 0.343161 0.999168 0.350621 0.93424C0.358081 0.869312 0.373001 0.795965 0.395382 0.714206C0.417762 0.632448 0.450093 0.545877 0.492362 0.454495L0.555772 0.317425L0.559502 0.306604L0.563232 0.295782L0.565478 0.29434L0.566962 0.292175L0.568454 0.290011L0.570692 0.288568L0.572938 0.290011L0.574422 0.292175L0.575914 0.29434L0.578152 0.295782L0.580398 0.297225L0.581882 0.29939L0.583374 0.301554L0.585612 0.302997L0.589342 0.310211L0.593072 0.317425L0.595318 0.318868L0.596802 0.321032L0.697513 0.429245C0.764653 0.501387 0.844229 0.581948 0.936234 0.670921C1.02825 0.759894 1.07922 0.806065 1.08916 0.809434C1.09912 0.813279 1.11154 0.824338 1.12646 0.842619C1.14138 0.860417 1.19112 0.902981 1.27567 0.970311C1.36022 1.03764 1.47087 1.1158 1.60764 1.20477C1.74441 1.29375 1.89609 1.38152 2.0627 1.46809C2.22931 1.55466 2.40835 1.63281 2.59982 1.70255C2.7913 1.77229 2.92558 1.81798 3.00266 1.83962C3.07975 1.86127 3.21154 1.88892 3.39804 1.92259C3.58454 1.95625 3.72505 1.9779 3.81954 1.98751C3.91403 1.99713 3.97869 2.00266 4.0135 2.00411L4.06572 2.00555L4.06423 1.99473L4.06199 1.98391L4.04707 1.89373C4.03712 1.83361 4.03215 1.74944 4.03215 1.64123C4.03215 1.53302 4.04085 1.43322 4.05826 1.34184C4.07567 1.25046 4.10178 1.15788 4.13659 1.0641C4.1714 0.970311 4.20547 0.895038 4.23879 0.838291C4.27261 0.78202 4.31687 0.717814 4.37158 0.645671C4.42629 0.573529 4.49716 0.498985 4.58419 0.422031C4.67122 0.345077 4.77069 0.276542 4.88259 0.216426C4.99449 0.15631 5.09769 0.110615 5.19218 0.0793563C5.28668 0.0480971 5.36625 0.0276521 5.4309 0.0180355C5.49556 0.00841898 5.52788 0.00288568 5.52788 0.00144284Z" fill="white"/>
</svg>
</span>
<span class="share__item-text">Twitter</span>
</a>
<a href="#" class="share__item" data-code="tg">
<span class="share__item-icon share__item-icon--tg">
<svg width="10" height="7" viewBox="0 0 10 7" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.39589 3.04852C1.39589 3.04852 5.05491 1.51189 6.32392 0.9708C6.8104 0.754384 8.46012 0.0617918 8.46012 0.0617918C8.46012 0.0617918 9.22155 -0.241191 9.15809 0.494655C9.13692 0.797667 8.96773 1.85815 8.79854 3.00523C8.54472 4.62846 8.26976 6.40316 8.26976 6.40316C8.26976 6.40316 8.22746 6.90097 7.86791 6.98753C7.50836 7.0741 6.91613 6.68455 6.8104 6.59795C6.72577 6.53304 5.22411 5.5591 4.6742 5.08295C4.52614 4.9531 4.35695 4.6934 4.69533 4.39039C5.45676 3.67617 6.36622 2.78882 6.91613 2.2261C7.16995 1.96638 7.42374 1.36038 6.36622 2.09622C4.86456 3.15674 3.38403 4.15231 3.38403 4.15231C3.38403 4.15231 3.04561 4.36873 2.41111 4.17394C1.77657 3.97918 1.03631 3.71945 1.03631 3.71945C1.03631 3.71945 0.528726 3.39481 1.39589 3.04852Z" fill="white"/>
</svg>
</span>
<span class="share__item-text">Telegram</span>
</a>
<a href="#" class="share__item js-share-item-copy">
<span class="share__item-icon share__item-icon--copy">
<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.19922 5.40327C4.37217 5.63449 4.59283 5.8258 4.84622 5.96425C5.09962 6.10269 5.37982 6.18501 5.66783 6.20564C5.95584 6.22627 6.24492 6.18471 6.51546 6.08379C6.78599 5.98287 7.03166 5.82495 7.2358 5.62074L8.44399 4.41255C8.81079 4.03277 9.01375 3.52412 9.00917 2.99615C9.00458 2.46818 8.79281 1.96313 8.41946 1.58978C8.04611 1.21644 7.54106 1.00466 7.01309 1.00008C6.48512 0.995488 5.97647 1.19845 5.59669 1.56525L4.904 2.25392" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M5.81002 4.59658C5.63707 4.36536 5.41641 4.17404 5.16302 4.0356C4.90962 3.89716 4.62942 3.81483 4.34141 3.79421C4.0534 3.77358 3.76432 3.81514 3.49379 3.91605C3.22325 4.01697 2.97758 4.17489 2.77344 4.3791L1.56525 5.58729C1.19845 5.96707 0.995488 6.47572 1.00008 7.0037C1.00466 7.53167 1.21644 8.03672 1.58978 8.41006C1.96313 8.78341 2.46818 8.99518 2.99615 8.99977C3.52412 9.00436 4.03277 8.80139 4.41255 8.43459L5.10122 7.74592" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
<span class="share__item-text">Скопировать ссылку</span>
</a>
</div>
</div> <!-- //share -->
</noindex>
<div class="row">
<div class="col-xl-9 col-lg-8 col-poster">
<div class="article-poster">
<picture >
<img src="https://248006.selcdn.ru/main/iblock/5b3/5b3a25b68679c1da50a3f78d8a539844/f724660c8ba67cd425cf6eced76b415d.png" itemprop='image' class='hidden-xs' />
</picture> <picture >
<img src="https://248006.selcdn.ru/main/iblock/5b3/5b3a25b68679c1da50a3f78d8a539844/f724660c8ba67cd425cf6eced76b415d.png" itemprop='image' class='visible-xs' />
</picture> </div>
<noindex>
<p class="article-poster-text" data-nosnippet>
Иллюстрация: Оля Ежак для Skillbox Media </p>
</noindex>
</div>
<div class="col-xl-3 col-lg-4 col-author">
<div class="article-author">
<div class="article-author__image">
<a href="/media/authors/code-skillbox-media/">
<img src="https://248006.selcdn.ru/main/iblock/168/168916384f65586cc4e6b7cfbbb69613/0dd44147b96863097b5219fdd6fd0e08.png" alt="Редакция «Код» Skillbox Media">
</a>
</div>
<div class="article-author__info">
<div class="article-author__name">
Редакция «Код» Skillbox Media </div>
<div class="article-author__description">
Онлайн-журнал для тех, кто влюблён в код и информационные технологии. Пишем для айтишников и об айтишниках. </div>
</div>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row flex-row-rev">
<div class="col-xl-3 col-lg-4 col-author">
<div class="js-article-banner" data-article-banner-mobile data-type="side_mounted" data-article-banner-sticky-start>
<!--AdFox START-->
<!--yandex_skillbox.media-->
<!--Площадка: Skillbox / Сквозной для застройщика Легенда / Боковой баннер сквозной для застройщика Легенда-->
<!--Категория: <не задана>-->
<!--Тип баннера: Media banner-->
<div id="adfox_176131540100027244"></div>
<script>
window.yaContextCb.push(()=>{
Ya.adfoxCode.create({
ownerId: 11649869,
containerId: 'adfox_176131540100027244',
params: {
p1: 'dkugb',
p2: 'p'
}
})
})
</script> </div>
<div class="js-article-banner" data-article-banner-mobile data-type="vertical" data-article-banner-sticky-end></div>
</div>
<div class="col-xl-9 col-lg-8 col-poster">
<div class="container container--setka">
<div class="js-article-banner" data-type="top"></div>
<div class="article-detail-text__setka" data-detail-text>
<div class="stk-post stk-layout_12col_18068 stk-theme_26309" data-stk="{"images":[{"id":112510,"alt":"","caption":""},{"id":112509,"alt":"","caption":""},{"id":112508,"alt":"","caption":""},{"id":112511,"alt":"","caption":""}]}" data-ui-id="post" data-ce-tag="post" data-reset-type="class" data-layout-type="auto" data-editor-version="3.2.8-rc1"><div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><p class="stk-reset" data-ce-tag="paragraph">Есть популярная фраза: «Зачем изобретать то, что уже изобретено?» Она актуальна не только в быту, но и в профессиональной деятельности. Например, архитектор использует проверенные конструкции, чтобы обеспечить надёжность проектируемого здания. Точно так же разработчики применяют готовые решения для стандартных задач. Эти решения называются паттернами проектирования, и о них мы поговорим в статье.</p><p class="stk-reset" data-ce-tag="paragraph">Мы познакомимся с концепцией паттернов, их классификацией и примерами реализации на языке Java. Поскольку тема сложная, мы будем намеренно упрощать материал и избегать погружения в технические детали, которые встречаются на практике. Считайте это вводным гайдом.</p><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Содержание</strong></p><ul class="stk-theme_26309__pad_hor_1 stk-theme_26309__mb_05 stk-reset" data-ce-tag="list"><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-1">Что такое паттерны</a></li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-2">Основные шаблоны проектирования</a></li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-3">Порождающие паттерны проектирования</a></li></ul><ul class="stk-theme_26309__pad_hor_1 stk-theme_26309__mb_05 stk-reset" data-stk-css="stkwx9Ew" data-ce-tag="list"><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-4">«Фабрика» (Factory)</a></li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-5">«Строитель» (Builder)</a></li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-6">«Одиночка» (Singleton)</a></li></ul><ul class="stk-theme_26309__pad_hor_1 stk-theme_26309__mb_05 stk-reset" data-ce-tag="list"><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-7">Структурные паттерны проектирования</a></li></ul><ul class="stk-theme_26309__pad_hor_1 stk-theme_26309__mb_05 stk-reset" data-stk-css="stk0eajB" data-ce-tag="list"><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-8">«Адаптер» (Adapter)</a></li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-9">«Декоратор» (Decorator)</a></li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-10">«Фасад» (Facade)</a></li></ul><ul class="stk-theme_26309__pad_hor_1 stk-theme_26309__mb_05 stk-reset" data-ce-tag="list"><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-11">Поведенческие паттерны проектирования</a></li></ul><ul class="stk-theme_26309__pad_hor_1 stk-theme_26309__mb_05 stk-reset" data-stk-css="stkGcd4Q" data-ce-tag="list"><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-12">«Стратегия» (Strategy)</a></li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-13">«Наблюдатель» (Observer)</a></li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-14">«Посетитель» (Visitor)</a></li></ul><ul class="stk-theme_26309__mb_05 stk-reset stk-theme_26309__pad_hor_1" data-ce-tag="list"><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-15">Что дальше</a></li></ul><hr class="stk-theme_26309__separator_divider-1498128612642 stk-reset"/></div></div><div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph" id="stk-1"><strong class="stk-reset">Что такое паттерны</strong></h2><p class="stk-reset" data-ce-tag="paragraph">Любой проект начинается с анализа требований и решения конкретных задач. Например, при разработке интернет-магазина нужно реализовать удобный каталог товаров с поиском и фильтрацией, корзину покупок, безопасную обработку платежей и систему обновления статуса заказов. Разработка этих компонентов с нуля потребует много времени, хотя аналогичные решения уже реализованы другими разработчиками.</p><p class="stk-reset" data-ce-tag="paragraph">Паттерны проектирования предлагают готовые, проверенные решения для типовых задач. Например, в интернет-магазине паттерн «Наблюдатель» отвечает за автоматическое обновление статуса заказа на странице покупателя, а паттерн «Стратегия» — за реализацию различных способов оплаты: банковской картой, электронным кошельком или наличными.</p><p class="stk-reset" data-ce-tag="paragraph">При этом важно понимать, что паттерн — это не готовый код для вставки, а общая концепция решения задачи. Конкретная реализация всегда зависит от технологий и требований проекта. Так, паттерн «Наблюдатель» в веб-разработке можно внедрить с помощью различных подходов: через механизм событий в JavaScript, с использованием WebSocket или путём отслеживания изменений в базе данных с применением <a href="https://skillbox.ru/media/code/chto-takoe-graphql-kak-on-rabotaet-i-zachem-ponadobilsya/" target="_blank" class="stk-reset">GraphQL</a>.</p><p class="stk-reset" data-ce-tag="paragraph">Паттерны можно комбинировать между собой. Например, при оформлении заказа в интернет-магазине используются сразу несколько паттернов: «Стратегия» для выбора способа оплаты, <span class="stk-reset" data-stk-footnote-link="fnWAOf0">«Фабрика»</span> для создания объекта заказа и «Декоратор» для добавления гарантии или дополнительных услуг.</p><p class="stk-reset" data-ce-tag="paragraph">Однако паттерны не следует применять без необходимости. Их главная цель — упростить архитектуру, сделать код более гибким и удобным в поддержке. В некоторых случаях усложнение может привести к противоположному эффекту. Допустим, у вас есть небольшой метод с несколькими условиями <u class="stk-reset">if-else</u>, не всегда целесообразно заменять его паттерном «Стратегия» — иногда простая конструкция будет более читабельной и эффективной.</p><figure class="stk-reset stk-image-figure" data-ce-tag="image-figure"><div class="stk-mask" data-ce-tag="mask"><img src="/upload/setka_images/15331115032025_accf102caaa970ce65d217b9ae9a8e9a57caa67c.jpg" data-image-id="112511" data-image-name="1.jpg" width="1540" height="866" loading="lazy" class="stk-image stk-reset"/></div><figcaption style="display:block" class="stk-reset stk-description" data-ce-tag="description">Пример паттернов проектирования при создании интернет-магазина<br><em class="stk-reset">Изображение: <a href="https://www.mermaidchart.com/" target="_blank" class="stk-reset">Mermaid Chart</a> / Skillbox Media</em></figcaption></figure></div></div><div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph" id="stk-2"><strong class="stk-reset">Основные шаблоны проектирования</strong></h2><p class="stk-reset" data-ce-tag="paragraph">Все шаблоны проектирования можно разделить на три категории: порождающие, структурные и поведенческие. Порождающие паттерны отвечают за создание объектов, структурные — за организацию компонентов системы, а поведенческие — за взаимодействие между объектами.</p><p class="stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Порождающие паттерны</strong> — это специальные конструкции, которые автоматизируют создание объектов в программе. Они работают как фабрики: вместо того чтобы создавать каждый объект вручную, разработчик использует готовый класс-конструктор, который делает всю работу за него.</p><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">К порождающим паттернам относятся:</p><ul class="stk-theme_26309__pad_hor_1 stk-reset" data-ce-tag="list"><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/Factory_method_pattern" target="_blank" class="stk-reset">«Фабричный метод» (Factory Method)</a>;</li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/Abstract_factory_pattern" target="_blank" class="stk-reset">«Абстрактная фабрика» (Abstract Factory)</a>;</li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/Builder_pattern" target="_blank" class="stk-reset">«Строитель» (Builder)</a>;</li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/Prototype_pattern" target="_blank" class="stk-reset">«Прототип» (Prototype)</a>;</li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/Singleton_pattern" target="_blank" class="stk-reset">«Одиночка» (Singleton)</a>.</li></ul><p class="stk-reset" data-ce-tag="paragraph">Представьте конвейер по сборке компьютеров: на одной линии собирают материнские платы, на другой — процессоры, на третьей — блоки питания. Каждая линия специализируется на определённом компоненте и производит различные его модификации. Так же работает паттерн «Фабричный метод», где каждая фабрика создаёт свой тип объектов. Например, одна фабрика отвечает за пользовательские интерфейсы, другая — за форматы документов, а третья — за базы данных. Разработчику достаточно указать параметры, и фабрика создаст нужный объект.</p><p class="stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Структурные паттерны</strong> определяют способы организации классов и объектов в крупные системы. Они расширяют функциональность компонентов и управляют структурой программы. Как в конструкторе LEGO, где сложные модели создаются из простых деталей, структурные паттерны позволяют строить масштабные системы из отдельных компонентов.</p><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">Существует семь структурных паттернов:</p><ul class="stk-theme_26309__pad_hor_1 stk-reset" data-ce-tag="list"><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/Adapter_pattern" target="_blank" class="stk-reset">«Адаптер» (Adapter)</a>;</li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/Bridge_pattern" target="_blank" class="stk-reset">«Мост» (Bridge)</a>;</li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/Composite_pattern" target="_blank" class="stk-reset">«Компоновщик» (Composite)</a>;</li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/Decorator_pattern" target="_blank" class="stk-reset">«Декоратор» (Decorator)</a>;</li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/Facade_pattern" target="_blank" class="stk-reset">«Фасад» (Facade)</a>;</li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/Flyweight_pattern" target="_blank" class="stk-reset">«Приспособленец» (Flyweight)</a>;</li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/Proxy_pattern" target="_blank" class="stk-reset">«Заместитель» (Proxy)</a>.</li></ul><p class="stk-reset" data-ce-tag="paragraph">Допустим, у вас есть европейская вилка и американская розетка. Без переходника их не получится соединить из-за разных стандартов. Такая же ситуация в программировании, когда у компонентов несовместимые интерфейсы. В этом случае на помощь приходит паттерн «Адаптер»: он делает интерфейсы совместимыми и обеспечивает их взаимодействие.</p><p class="stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Поведенческие паттерны</strong> отвечают за коммуникацию между компонентами программы. Они определяют способы обмена информацией и устанавливают принципы распределения обязанностей между объектами. Это позволяет организовать взаимодействие так, чтобы объекты оставались слабо связанными, но при этом могли эффективно работать друг с другом.</p><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">К основным поведенческим паттернам относятся:</p><ul class="stk-theme_26309__pad_hor_1 stk-reset" data-ce-tag="list"><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/Command_pattern" target="_blank" class="stk-reset">«Команда» (Command)</a>;</li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/Iterator_pattern" target="_blank" class="stk-reset">«Итератор» (Iterator)</a>;</li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/Mediator_pattern" target="_blank" class="stk-reset">«Посредник» (Mediator)</a>;</li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/Memento_pattern" target="_blank" class="stk-reset">«Хранитель» (Memento)</a>;</li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/Observer_pattern" target="_blank" class="stk-reset">«Наблюдатель» (Observer)</a>;</li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/Chain-of-responsibility_pattern" target="_blank" class="stk-reset">«Цепочка обязанностей» (Chain of responsibility)</a>;</li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/State_pattern" target="_blank" class="stk-reset">«Состояние» (State)</a>;</li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/Strategy_pattern" target="_blank" class="stk-reset">«Стратегия» (Strategy)</a>;</li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/Template_method_pattern" target="_blank" class="stk-reset">«Шаблонный метод» (Template method)</a>;</li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://en.wikipedia.org/wiki/Visitor_pattern" target="_blank" class="stk-reset">«Посетитель» (Visitor)</a>.</li></ul><p class="stk-reset" data-ce-tag="paragraph">Рассмотрим систему светофоров в большом городе. Каждый светофор управляет движением на своём перекрёстке (как отдельный объект системы), а все светофоры координируются через единый центр управления («Посредник»). В случае аварии или пробки система корректирует режим работы всех светофоров («Наблюдатель»), а алгоритмы регулируют время переключения сигналов в зависимости от ситуации на дороге («Стратегия»).</p><div class="stk-grid" data-ce-tag="grid" data-stk-css="stkl0i3V"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><p class="stk-reset" data-ce-tag="paragraph">В следующих разделах мы рассмотрим популярные паттерны из каждой категории на простых примерах. Код будет представлен в упрощённом виде — без сложных оптимизаций, которые обычно используются в реальных проектах. Это поможет лучше понять суть паттернов и начать ими пользоваться. Однако для работы с примерами вам понадобится установить Java и настроить среду разработки под свою операционную систему.</p><div class="stk-grid__layout_reverse stk-grid valign-middle" data-stk-css="stkRLueu" data-ce-tag="grid"><div data-col-width="4" class="stk-grid-col stk-grid-col_last valign-middle" data-ce-tag="grid-col" data-stk-css="" data-stk-css-m=""><figure class="stk-reset stk-image-figure" data-ce-tag="image-figure"><div class="stk-mask" data-ce-tag="mask"><img src="/upload/setka_images/15331015032025_116fabfed9db662d1ca4922820b351a40369b79d.png" data-image-id="112508" data-image-name="rm1.png" class="stk-image stk-reset" width="372" height="200" loading="lazy"/></div></figure></div><div data-col-width="8" class="stk-grid-col valign-middle" data-ce-tag="grid-col"><p class="stk-reset stk-theme_26309__mb_05 stk-theme_26309__style_font_style-1629726727970" data-ce-tag="paragraph">Читайте также:</p><p class="stk-theme_26309__mb_15 stk-reset stk-theme_26309__style_font_style-1629786048064 stk-theme_26309__style_font_style-1629290372003 stk-theme_26309__color_26309_custom_color_1 article_incut" data-ce-tag="paragraph"><a href="https://skillbox.ru/media/base/kak_ustanovit_jdk_i_sredu_razrabotki_intellij_idea/?utm_source=media&utm_medium=link&utm_campaign=all_all_media_links_links_articles_all_all_skillbox" target="_blank" class="stk-reset">Как установить JDK и среду разработки IntelliJ IDEA</a></p></div></div></div></div></div></div><div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph" id="stk-3"><strong class="stk-reset">Порождающие паттерны проектирования</strong></h2><p class="stk-reset stk-theme_26309__mb_15" data-ce-tag="paragraph">В крупных проектах чаще всего встречаются три порождающих шаблона: «Фабричный метод», «Строитель» и «Одиночка». Разберём их подробнее.</p><h3 class="stk-theme_26309__style_medium_header stk-theme_26309__mb_05 stk-reset" id="stk-4" data-ce-tag="paragraph"><strong class="stk-reset">«Фабрика» (Factory)</strong></h3><p class="stk-reset" data-ce-tag="paragraph">Паттерн «Фабрика» (или «Фабричный метод») — это порождающий паттерн проектирования, который создаёт объекты суперкласса без указания их конкретного типа. Принцип работы построен на использовании общего интерфейса, или абстрактного класса, через который создаются разные реализации объектов. Главное преимущество паттерна заключается в устранении жёсткой привязки к конкретным классам, что делает код гибким и легко расширяемым. Паттерн также <span class="stk-reset" data-stk-footnote-link="fnt1cQI">инкапсулирует</span> детали создания объектов, что упрощает работу с кодом и делает его более поддерживаемым.</p><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">Рассмотрим работу паттерна «Фабрика» на примере программы для пиццерии. Мы создадим фабрику с единым интерфейсом, которая будет производить три вида пиццы: «Четыре сыра», «Пепперони» и «Маргариту». Затем при заказе определённого вида пиццы фабрика вернёт нам готовый объект.</p><figure class="stk-reset stk-embed_rendered stk-theme_26309__mb_15" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(170, 170, 170);">public <span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">MainFactory</span> </span>{
public static void main(<span class="hljs-type" style="font-style: italic; color: rgb(255, 85, 255);">String</span>[] args) {
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Создаём объект фабрики, которая будет производить пиццу</span>
<span class="hljs-type" style="font-style: italic; color: rgb(255, 85, 255);">PizzaFactory</span> pizzaFactory = <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> <span class="hljs-type" style="font-style: italic; color: rgb(255, 85, 255);">PizzaFactory</span>();
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">try</span> {
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Заказываем пиццу «Четыре сыра» у фабрики</span>
<span class="hljs-type" style="font-style: italic; color: rgb(255, 85, 255);">Pizza</span> pizza = pizzaFactory.createPizza(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Четыре сыра"</span>);
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Вызываем метод приготовления пиццы</span>
pizza.doPizza();
} <span class="hljs-keyword" style="color: rgb(255, 255, 85);">catch</span> (<span class="hljs-type" style="font-style: italic; color: rgb(255, 85, 255);">IllegalArgumentException</span> e) {
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Если пиццы нет в меню, выводим сообщение об ошибке</span>
<span class="hljs-type" style="font-style: italic; color: rgb(255, 85, 255);">System</span>.out.println(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Ошибка: "</span> + e.getMessage());
}
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Фабрика — главный класс, который создаёт объекты пицц</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">PizzaFactory</span> </span>{
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Метод createPizza принимает название пиццы и возвращает нужный объект</span>
public <span class="hljs-type" style="font-style: italic; color: rgb(255, 85, 255);">Pizza</span> createPizza(<span class="hljs-type" style="font-style: italic; color: rgb(255, 85, 255);">String</span> <span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">type</span>) </span>{
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Проверяем название пиццы и создаём соответствующий объект</span>
switch(<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">type</span>.<span class="hljs-title" style="color: rgb(136, 136, 255);">toLowerCase</span>(<span class="hljs-params" style="color: rgb(136, 136, 255);"></span>)) </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">case</span> <span class="hljs-string" style="color: rgb(255, 85, 255);">"Четыре сыра"</span>:
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">return</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> <span class="hljs-type" style="font-style: italic; color: rgb(255, 85, 255);">FourCheesePizza</span>();
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">case</span> <span class="hljs-string" style="color: rgb(255, 85, 255);">"Пепперони"</span>:
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">return</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> <span class="hljs-type" style="font-style: italic; color: rgb(255, 85, 255);">PepperoniPizza</span>();
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">case</span> <span class="hljs-string" style="color: rgb(255, 85, 255);">"Маргарита"</span>:
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">return</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> <span class="hljs-type" style="font-style: italic; color: rgb(255, 85, 255);">MargaritaPizza</span>();
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">default</span>:
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">throw</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> <span class="hljs-type" style="font-style: italic; color: rgb(255, 85, 255);">IllegalArgumentException</span>(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Такой пиццы нет в меню: "</span> + <span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">type</span>)</span>;
}
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Базовый абстрактный класс для всех видов пицц</span>
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">abstract</span> <span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">Pizza</span> </span>{
public <span class="hljs-keyword" style="color: rgb(255, 255, 85);">abstract</span> void doPizza();
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Конкретные классы пицц</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">FourCheesePizza</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">extends</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">Pizza</span> </span>{
<span class="hljs-meta" style="color: rgb(85, 255, 255);">@Override</span>
public void doPizza() {
<span class="hljs-type" style="font-style: italic; color: rgb(255, 85, 255);">System</span>.out.println(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Готовим особую пиццу «Четыре сыра» с моцареллой, пармезаном, горгонзолой и чеддером!"</span>);
}
}
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">PepperoniPizza</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">extends</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">Pizza</span> </span>{
<span class="hljs-meta" style="color: rgb(85, 255, 255);">@Override</span>
public void doPizza() {
<span class="hljs-type" style="font-style: italic; color: rgb(255, 85, 255);">System</span>.out.println(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Готовим классическую пиццу «Пепперони» с острыми колбасками!"</span>);
}
}
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">MargaritaPizza</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">extends</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">Pizza</span> </span>{
<span class="hljs-meta" style="color: rgb(85, 255, 255);">@Override</span>
public void doPizza() {
<span class="hljs-type" style="font-style: italic; color: rgb(255, 85, 255);">System</span>.out.println(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Готовим традиционную пиццу «Маргарита» с томатами и базиликом!"</span>);
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Если вы запустите этот код, фабрика создаст пиццу «Четыре сыра»</span></pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><h3 class="stk-theme_26309__style_medium_header stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph" id="stk-5"><strong class="stk-reset">«Строитель» (Builder)</strong></h3><p class="stk-reset" data-ce-tag="paragraph">Паттерн «Строитель» предлагает пошаговый способ создания сложных объектов. Его главное преимущество — возможность конструировать разные версии объекта через единый процесс. При этом код остаётся чистым, а настройки объекта можно изменять без изменения его базовой структуры.</p><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">В качестве примера рассмотрим пошаговую сборку виртуального компьютера с тремя основными компонентами: мощным центральным процессором (CPU), видеокартой (GPU) и оперативной памятью (memory).</p><figure class="stk-reset stk-embed_rendered stk-theme_26309__mb_15" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(170, 170, 170);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">MainBuilder</span> </span>{
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">static</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">main</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(String[] args)</span> </span>{
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Создаём объект строителя для сборки компьютера</span>
ComputerBuilder builder = <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> GamingPCBuilder();
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Создаём объект директора для управления процессом сборки</span>
PCDirector director = <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> PCDirector(builder);
director.constructGamingPC();
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Получаем готовый собранный компьютер</span>
Computer gamingPC = builder.getPC();
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Выводим характеристики собранного компьютера</span>
System.out.println(gamingPC);
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Создаём класс Computer для хранения характеристик собранного устройства</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">Computer</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">private</span> String CPU; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Процессор</span>
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">private</span> String GPU; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Видеокарта</span>
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">private</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">int</span> memory; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Объём оперативной памяти (ГБ)</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">Computer</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(String CPU, String GPU, <span class="hljs-keyword" style="color: rgb(255, 255, 85);">int</span> memory)</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">this</span>.CPU = CPU;
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">this</span>.GPU = GPU;
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">this</span>.memory = memory;
}
<span class="hljs-meta" style="color: rgb(85, 255, 255);">@Override</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> String <span class="hljs-title" style="color: rgb(170, 170, 170);">toString</span><span class="hljs-params" style="color: rgb(136, 136, 255);">()</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">return</span> <span class="hljs-string" style="color: rgb(255, 85, 255);">"Компьютер: "</span> + CPU + <span class="hljs-string" style="color: rgb(255, 85, 255);">", "</span> + GPU + <span class="hljs-string" style="color: rgb(255, 85, 255);">", "</span> + memory + <span class="hljs-string" style="color: rgb(255, 85, 255);">" ГБ"</span>;
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Создаём интерфейс «Строитель компьютеров» для пошаговой сборки</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">interface</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">ComputerBuilder</span> </span>{
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">setCPU</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(String CPU)</span></span>;
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">setGPU</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(String GPU)</span></span>;
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">setMemory</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(<span class="hljs-keyword" style="color: rgb(255, 255, 85);">int</span> memory)</span></span>;
<span class="hljs-function" style="color: rgb(255, 255, 85);">Computer <span class="hljs-title" style="color: rgb(170, 170, 170);">getPC</span><span class="hljs-params" style="color: rgb(136, 136, 255);">()</span></span>;
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Создаём класс «Игровой компьютер» для сборки компьютеров с мощными характеристиками</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">GamingPCBuilder</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">implements</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">ComputerBuilder</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">private</span> String CPU;
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">private</span> String GPU;
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">private</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">int</span> memory;
<span class="hljs-meta" style="color: rgb(85, 255, 255);">@Override</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">setCPU</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(String CPU)</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">this</span>.CPU = CPU;
}
<span class="hljs-meta" style="color: rgb(85, 255, 255);">@Override</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">setGPU</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(String GPU)</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">this</span>.GPU = GPU;
}
<span class="hljs-meta" style="color: rgb(85, 255, 255);">@Override</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">setMemory</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(<span class="hljs-keyword" style="color: rgb(255, 255, 85);">int</span> memory)</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">this</span>.memory = memory;
}
<span class="hljs-meta" style="color: rgb(85, 255, 255);">@Override</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> Computer <span class="hljs-title" style="color: rgb(170, 170, 170);">getPC</span><span class="hljs-params" style="color: rgb(136, 136, 255);">()</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">return</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> Computer(CPU, GPU, memory);
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Создаём класс «Директор» для управления процессом сборки компьютера</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">PCDirector</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">private</span> ComputerBuilder builder;
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">PCDirector</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(ComputerBuilder builder)</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">this</span>.builder = builder;
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Определяем метод для сборки игрового компьютера с заданными характеристиками</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">constructGamingPC</span><span class="hljs-params" style="color: rgb(136, 136, 255);">()</span> </span>{
builder.setCPU(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Intel Core i9-13900K"</span>); <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Устанавливаем мощный процессор</span>
builder.setGPU(<span class="hljs-string" style="color: rgb(255, 85, 255);">"NVIDIA GeForce RTX 4090"</span>); <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Устанавливаем топовую видеокарту</span>
builder.setMemory(<span class="hljs-number" style="color: rgb(255, 85, 255);">32</span>); <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Добавляем 32 ГБ оперативной памяти</span>
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Компьютер: Intel Core i9-13900K, NVIDIA GeForce RTX 4090, 32 ГБ</span></pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><h3 class="stk-theme_26309__style_medium_header stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph" id="stk-6"><strong class="stk-reset">«Одиночка» (Singleton)</strong></h3><p class="stk-reset" data-ce-tag="paragraph">Паттерн «Одиночка» гарантирует существование только одного экземпляра класса в программе и обеспечивает единую точку доступа к нему. Это предотвращает конфликты при работе с общими ресурсами. Например, если бы существовало несколько экземпляров менеджера настроек, они могли бы противоречить друг другу: один установил бы светлую тему, а другой тёмную. Паттерн «Одиночка» помогает избежать подобных проблем.</p><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">Допустим, нам нужно создать общее соединение с базой данных для всего приложения. В этом случае все обращения к базе данных будут проходить через один и тот же экземпляр соединения. Такой подход обеспечит целостность данных и исключит конфликты при работе с ресурсом.</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(170, 170, 170);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">MainSingleton</span> {
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">static</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">main</span>(<span class="hljs-params" style="color: rgb(136, 136, 255);">String[] args</span>) </span>{
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Получаем единственный экземпляр соединения с базой данных через метод getInstance()</span>
DBConnection db1 = DBConnection.getInstance();
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Выполняем SQL-запрос на создание базы данных</span>
db1.executeQuery(db1.hashCode() + <span class="hljs-string" style="color: rgb(255, 85, 255);">": CREATE DATABASE Users"</span>);
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Получаем тот же самый экземпляр соединения с базой данных</span>
DBConnection db2 = DBConnection.getInstance();
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Выполняем SQL-запрос для получения данных из базы</span>
db2.executeQuery(db2.hashCode() + <span class="hljs-string" style="color: rgb(255, 85, 255);">": SELECT * FROM Users"</span>);
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Проверяем, что оба объекта ссылаются на один и тот же экземпляр</span>
System.<span class="hljs-keyword" style="color: rgb(255, 255, 85);">out</span>.println(db1 == db2); <span class="hljs-comment" style="color: rgb(85, 255, 255);">// true</span>
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Класс «Соединение с базой данных», который реализует паттерн Singleton</span>
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">DBConnection</span> {
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">private</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">static</span> DBConnection instance; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Единственный экземпляр класса</span>
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Приватный конструктор для предотвращения создания объекта извне</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">private</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">DBConnection</span>(<span class="hljs-params" style="color: rgb(136, 136, 255);"></span>) </span>{
System.<span class="hljs-keyword" style="color: rgb(255, 255, 85);">out</span>.println(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Singleton создан. Соединение с БД установлено."</span>);
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Метод для получения единственного экземпляра класса</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">static</span> synchronized DBConnection <span class="hljs-title" style="color: rgb(170, 170, 170);">getInstance</span>(<span class="hljs-params" style="color: rgb(136, 136, 255);"></span>) </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">if</span> (instance == <span class="hljs-literal" style="color: rgb(255, 85, 255);">null</span>) {
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Если экземпляр ещё не создан, создаём его</span>
instance = <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> DBConnection();
}
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">return</span> instance; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Возвращаем единственный экземпляр</span>
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Метод для выполнения SQL-запросов</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> synchronized <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">executeQuery</span>(<span class="hljs-params" style="color: rgb(136, 136, 255);">String query</span>) </span>{
System.<span class="hljs-keyword" style="color: rgb(255, 255, 85);">out</span>.println(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Запрос: "</span> + query);
}
}</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">После запуска кода мы получим результат <u class="stk-reset">true</u>. Это доказывает, что паттерн «Одиночка» работает корректно — оба объекта <u class="stk-reset">db1</u> и <u class="stk-reset">db2</u> действительно ссылаются на один и тот же экземпляр класса. Рассмотрим вывод в консоли:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(170, 170, 170);">Singleton создан. Соединение с БД установлено.
// Выполняем SQL-запрос через объект db1 (где 1392838282 — хеш-код объекта, который может меняться при каждом запуске программы)
<span class="hljs-keyword" style="color: rgb(250, 250, 250);">Запрос: 1392838282: CREATE</span> <span class="hljs-keyword" style="color: rgb(250, 250, 250);">DATABASE</span> <span class="hljs-keyword" style="color: rgb(250, 250, 250);">Users</span>
// Выполняем SQL-запрос через тот же объект db2 (хеш-коды совпадают)
<span class="hljs-number" style="color: rgb(250, 250, 250);">Запрос: 1392838282: SELECT * FROM Users</span>
// Паттерн «Одиночка» сработал правильно
<span class="hljs-number" style="color: rgb(250, 250, 250);">true</span>
</code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure></div></div><div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph" id="stk-7"><strong class="stk-reset">Структурные паттерны проектирования</strong></h2><p class="stk-reset stk-theme_26309__mb_15" data-ce-tag="paragraph">В этом разделе мы рассмотрим три ключевых структурных паттерна современной разработки: «Адаптер», «Декоратор» и «Фасад».</p><h3 class="stk-theme_26309__style_medium_header stk-theme_26309__mb_05 stk-reset" id="stk-8" data-ce-tag="paragraph"><strong class="stk-reset">«Адаптер» (Adapter)</strong></h3><p class="stk-reset" data-ce-tag="paragraph">Паттерн «Адаптер» — это структурный шаблон проектирования, который позволяет преобразовать интерфейс одного класса в другой интерфейс, ожидаемый клиентом. Благодаря этому классы с несовместимыми интерфейсами могут работать вместе без изменения их исходного кода.</p><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">Представьте ситуацию: у вас смартфон с разъёмом Type-C, а наушники — с разъёмом 3.5 мм (Jack). Без переходника их соединить не получится. Давайте разберём ситуацию с помощью кода и попробуем совместить интерфейсы.</p><figure class="stk-reset stk-embed_rendered stk-theme_26309__mb_15" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(170, 170, 170);"><span class="hljs-comment" style="color: rgb(85, 255, 255);">// Интерфейс для устройств с разъёмом 3,5 мм (Jack)</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">interface</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">HeadphoneJack</span> </span>{
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">plugIn</span><span class="hljs-params" style="color: rgb(136, 136, 255);">()</span></span>; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Метод для подключения устройства с разъёмом 3,5 мм</span>
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Класс наушников, который реализует интерфейс для разъёма Jack</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">Headphones</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">implements</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">HeadphoneJack</span> </span>{
<span class="hljs-meta" style="color: rgb(85, 255, 255);">@Override</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">plugIn</span><span class="hljs-params" style="color: rgb(136, 136, 255);">()</span> </span>{
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Подключаем наушники через разъём Jack</span>
System.out.println(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Наушники с разъёмом Jack подключены!"</span>);
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Интерфейс для устройств с разъёмом Type-C</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">interface</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">TypeCDevice</span> </span>{
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">connect</span><span class="hljs-params" style="color: rgb(136, 136, 255);">()</span></span>; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Метод для подключения устройства через разъём Type-C</span>
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Класс-адаптер, который позволяет подключать устройства с разъёмом Jack через Type-C</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">HeadphoneAdapter</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">implements</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">TypeCDevice</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">private</span> HeadphoneJack headphoneJack; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Объект с разъёмом Jack, который мы будем подключать через адаптер</span>
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Конструктор адаптера принимает устройство с разъёмом Jack</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">HeadphoneAdapter</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(HeadphoneJack headphoneJack)</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">this</span>.headphoneJack = headphoneJack; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Сохраняем переданное устройство</span>
}
<span class="hljs-meta" style="color: rgb(85, 255, 255);">@Override</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">connect</span><span class="hljs-params" style="color: rgb(136, 136, 255);">()</span> </span>{
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Подключаем наушники через разъём Jack, несмотря на то, что используем Type-C</span>
headphoneJack.plugIn();
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Главный класс программы, точка входа</span>
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">MainAdapter</span> </span>{
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">static</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">main</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(String[] args)</span> </span>{
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Создаём объект наушников с разъёмом 3,5 мм</span>
HeadphoneJack headphones = <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> Headphones();
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Создаём адаптер для подключения наушников через разъём Type-C</span>
TypeCDevice adapter = <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> HeadphoneAdapter(headphones);
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Подключаем наушники через адаптер (разъём Type-C)</span>
adapter.connect();
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Результат: наушники с разъёмом Jack подключены!</span></pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><h3 class="stk-theme_26309__style_medium_header stk-theme_26309__mb_05 stk-reset" id="stk-9" data-ce-tag="paragraph"><strong class="stk-reset">«Декоратор» (Decorator)</strong></h3><p class="stk-reset" data-ce-tag="paragraph">Паттерн «Декоратор» позволяет расширять функциональность объекта без изменения его исходного кода. Представьте себе подарок: вы можете обернуть его в праздничную бумагу, добавить ленту, прикрепить открытку — и всё это, не трогая сам подарок. В программировании такой подход намного практичнее создания множества отдельных классов для каждой возможной комбинации функций. Вместо этого вы просто «оборачиваете» базовый объект в те дополнительные функции, которые нужны в данный момент.</p><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">Представим, что вы каждое утро заказываете кофе по своему вкусу. Сегодня это может быть классический чёрный кофе, завтра — кофе с молоком без сахара, а послезавтра — с сахаром. Давайте реализуем подобный механизм.</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(170, 170, 170);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">MainDecorator</span> </span>{
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">static</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">main</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(String[] args)</span> </span>{
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Создаём базовый объект — простой чёрный кофе без добавок</span>
Coffee coffee = <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> BlackCoffee();
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Выводим описание простого чёрного кофе</span>
System.out.println(coffee.getDescription());
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Добавляем молоко с помощью декоратора</span>
coffee = <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> MilkDecorator(coffee);
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Выводим описание кофе с добавлением молока</span>
System.out.println(coffee.getDescription());
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Добавляем сахар с помощью декоратора</span>
coffee = <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> SugarDecorator(coffee);
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Выводим описание кофе с молоком и сахаром</span>
System.out.println(coffee.getDescription());
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Интерфейс для кофе определяет метод получения описания напитка</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">interface</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">Coffee</span> </span>{
<span class="hljs-function" style="color: rgb(255, 255, 85);">String <span class="hljs-title" style="color: rgb(170, 170, 170);">getDescription</span><span class="hljs-params" style="color: rgb(136, 136, 255);">()</span></span>;
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Класс для чёрного кофе — реализация интерфейса Coffee</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">BlackCoffee</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">implements</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">Coffee</span> </span>{
<span class="hljs-meta" style="color: rgb(85, 255, 255);">@Override</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> String <span class="hljs-title" style="color: rgb(170, 170, 170);">getDescription</span><span class="hljs-params" style="color: rgb(136, 136, 255);">()</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">return</span> <span class="hljs-string" style="color: rgb(255, 85, 255);">"Чёрный кофе"</span>; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Просто чёрный кофе без добавок</span>
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Абстрактный класс-декоратор для расширения функциональности объекта Coffee</span>
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">abstract</span> <span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">CoffeeDecorator</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">implements</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">Coffee</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">protected</span> Coffee coffee; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Ссылаемся на объект Coffee, который будем модифицировать</span>
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Конструктор, принимающий базовый объект Coffee</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">CoffeeDecorator</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(Coffee coffee)</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">this</span>.coffee = coffee;
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Возвращаем описание кофе с добавленными характеристиками</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> String <span class="hljs-title" style="color: rgb(170, 170, 170);">getDescription</span><span class="hljs-params" style="color: rgb(136, 136, 255);">()</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">return</span> coffee.getDescription();
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Декоратор для добавления молока в кофе</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">MilkDecorator</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">extends</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">CoffeeDecorator</span> </span>{
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">MilkDecorator</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(Coffee coffee)</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">super</span>(coffee); <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Передаём кофе в конструктор базового класса</span>
}
<span class="hljs-meta" style="color: rgb(85, 255, 255);">@Override</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> String <span class="hljs-title" style="color: rgb(170, 170, 170);">getDescription</span><span class="hljs-params" style="color: rgb(136, 136, 255);">()</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">return</span> coffee.getDescription() + <span class="hljs-string" style="color: rgb(255, 85, 255);">", молоко"</span>; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Добавляем молоко к описанию</span>
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Декоратор для добавления сахара в кофе</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">SugarDecorator</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">extends</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">CoffeeDecorator</span> </span>{
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">SugarDecorator</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(Coffee coffee)</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">super</span>(coffee); <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Передаём кофе в конструктор базового класса</span>
}
<span class="hljs-meta" style="color: rgb(85, 255, 255);">@Override</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> String <span class="hljs-title" style="color: rgb(170, 170, 170);">getDescription</span><span class="hljs-params" style="color: rgb(136, 136, 255);">()</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">return</span> coffee.getDescription() + <span class="hljs-string" style="color: rgb(255, 85, 255);">", сахар"</span>; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Добавляем сахар к описанию</span>
}
}</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">Если мы запустим код, то получим следующий вывод:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(170, 170, 170);">Чёрный кофе
Чёрный кофе, молоко
Чёрный кофе, молоко, сахар</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph">Мы создали объект класса BlackCoffee (базовый чёрный кофе), а затем с помощью декораторов добавили к нему молоко и сахар. Каждый декоратор оборачивает предыдущий объект и добавляет к его описанию новый ингредиент. В результате получилась гибкая структура, к которой можно и дальше добавлять новые декораторы без изменения существующего кода. Например, попробуйте добавить в наш кофе корицу, сливки или сироп.</p><div class="stk-grid__layout_reverse stk-grid valign-middle stk-theme_26309__mb_15" data-stk-css="stknjGkh" data-ce-tag="grid"><div data-col-width="4" class="stk-grid-col stk-grid-col_last valign-middle" data-ce-tag="grid-col" data-stk-css="" data-stk-css-m=""><figure class="stk-reset stk-image-figure" data-ce-tag="image-figure"><div class="stk-mask" data-ce-tag="mask"><img src="/upload/setka_images/15331015032025_46dcb59ca8a4e3d30a63e20d6c27651d3a86b8cd.png" data-image-id="112509" data-image-name="rm2.png" class="stk-image stk-reset" width="372" height="200" loading="lazy"/></div></figure></div><div data-col-width="8" class="stk-grid-col valign-middle" data-ce-tag="grid-col"><p class="stk-reset stk-theme_26309__mb_05 stk-theme_26309__style_font_style-1629726727970" data-ce-tag="paragraph">Читайте также:</p><p class="stk-theme_26309__mb_15 stk-reset stk-theme_26309__style_font_style-1629786048064 stk-theme_26309__style_font_style-1629290372003 stk-theme_26309__color_26309_custom_color_1 article_incut" data-ce-tag="paragraph"><a href="https://skillbox.ru/media/base/shablon-dekorator-supersila-klassovobyertok/" target="_blank" class="stk-reset">Шаблон «Декоратор»: суперсила классов-обёрток</a></p></div></div><h3 class="stk-theme_26309__mb_05 stk-theme_26309__style_medium_header stk-reset" id="stk-10" data-ce-tag="paragraph"><strong class="stk-reset">«Фасад» (Facade)</strong></h3><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">Паттерн «Фасад» предоставляет единую точку входа для управления сложной системой и позволяет не вникать в её внутреннюю структуру. Это похоже на пульт от домашнего кинотеатра, с помощью которого можно управлять множеством устройств. Давайте попробуем создать такой пульт.</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(170, 170, 170);"><span class="hljs-comment" style="color: rgb(85, 255, 255);">// Класс для управления аудиосистемой</span>
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">AudioSystem</span> {
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Включаем аудиосистему</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">on</span>(<span class="hljs-params" style="color: rgb(136, 136, 255);"></span>) </span>{
System.<span class="hljs-keyword" style="color: rgb(255, 255, 85);">out</span>.println(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Аудиосистема 7.1 запущена"</span>);
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Выключаем аудиосистему</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">off</span>(<span class="hljs-params" style="color: rgb(136, 136, 255);"></span>) </span>{
System.<span class="hljs-keyword" style="color: rgb(255, 255, 85);">out</span>.println(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Аудиосистема 7.1 остановлена"</span>);
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Класс для управления экраном</span>
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">Screen</span> {
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Включаем экран</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">on</span>(<span class="hljs-params" style="color: rgb(136, 136, 255);"></span>) </span>{
System.<span class="hljs-keyword" style="color: rgb(255, 255, 85);">out</span>.println(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Изображение активировано"</span>);
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Выключаем экран</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">off</span>(<span class="hljs-params" style="color: rgb(136, 136, 255);"></span>) </span>{
System.<span class="hljs-keyword" style="color: rgb(255, 255, 85);">out</span>.println(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Изображение деактивировано"</span>);
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Фасад для упрощения работы с системой домашнего кинотеатра</span>
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">HomeTheaterFacade</span> {
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">private</span> AudioSystem audioSystem; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Объект аудиосистемы</span>
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">private</span> Screen screen; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Объект экрана</span>
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Конструктор, который принимает объекты аудиосистемы и экрана</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">HomeTheaterFacade</span>(<span class="hljs-params" style="color: rgb(136, 136, 255);">AudioSystem audioSystem, Screen screen</span>) </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">this</span>.audioSystem = audioSystem;
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">this</span>.screen = screen;
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Метод для включения всей системы кинотеатра</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">start</span>(<span class="hljs-params" style="color: rgb(136, 136, 255);"></span>) </span>{
System.<span class="hljs-keyword" style="color: rgb(255, 255, 85);">out</span>.println(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Включение системы домашнего кинотеатра:"</span>);
screen.on(); <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Включаем экран</span>
audioSystem.on(); <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Включаем аудиосистему</span>
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Метод для выключения всей системы кинотеатра</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">end</span>(<span class="hljs-params" style="color: rgb(136, 136, 255);"></span>) </span>{
System.<span class="hljs-keyword" style="color: rgb(255, 255, 85);">out</span>.println(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Выключение системы домашнего кинотеатра:"</span>);
audioSystem.off(); <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Выключаем аудиосистему</span>
screen.off(); <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Выключаем экран</span>
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Главный класс, где запускаем систему</span>
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">MainFacade</span> {
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">static</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">main</span>(<span class="hljs-params" style="color: rgb(136, 136, 255);">String[] args</span>) </span>{
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Создаём объекты экрана и аудиосистемы</span>
Screen screen = <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> Screen();
AudioSystem audioSystem = <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> AudioSystem();
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Создаём фасад, чтобы управлять системой кинотеатра через него</span>
HomeTheaterFacade homeTheater = <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> HomeTheaterFacade(audioSystem, screen);
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Включаем систему кинотеатра</span>
homeTheater.start();
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Выключаем систему кинотеатра</span>
homeTheater.end();
}
}</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">После запуска кода мы увидим, как объект фасада (HomeTheaterFacade) управляет всеми устройствами в качестве единой системы:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(170, 170, 170);">Включение системы домашнего кинотеатра:
Изображение активировано
Аудиосистема 7<span class="hljs-selector-class">.1</span> запущена
Выключение системы домашнего кинотеатра:
Аудиосистема 7<span class="hljs-selector-class">.1</span> остановлена
Изображение деактивировано</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure></div></div><div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph" id="stk-11"><strong class="stk-reset">Поведенческие паттерны проектирования</strong></h2><p class="stk-reset stk-theme_26309__mb_15" data-ce-tag="paragraph">В этом разделе мы познакомимся с тремя поведенческими шаблонами: «Стратегия», «Наблюдатель» и «Посетитель». Посмотрим, как эти паттерны определяют различные способы взаимодействия объектов в программе.</p><h3 class="stk-theme_26309__style_medium_header stk-theme_26309__mb_05 stk-reset" id="stk-12" data-ce-tag="paragraph"><strong class="stk-reset">«Стратегия» (Strategy)</strong></h3><p class="stk-reset" data-ce-tag="paragraph">Паттерн «Стратегия» определяет семейство взаимозаменяемых алгоритмов для решения схожей задачи, где каждый алгоритм инкапсулирован в отдельный класс. Например, в навигационном приложении можно реализовать разные способы построения маршрута как отдельные классы — автомобильный, пешеходный и велосипедный. Такой подход делает код чище и значительно упрощает добавление новых способов навигации.</p><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">Далее мы рассмотрим паттерн «Стратегия» на примере платёжного терминала с двумя способами оплаты: банковской картой и по QR-коду. Каждый из этих способов будет отдельным взаимозаменяемым алгоритмом.</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(170, 170, 170);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">MainStrategy</span> </span>{
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">static</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">main</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(String[] args)</span> </span>{
ShoppingCart cart = <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> ShoppingCart(); <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Создаём корзину покупок</span>
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Выбираем оплату картой и выполняем платёж</span>
cart.setPaymentStrategy(<span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> CreditCardPayment(<span class="hljs-string" style="color: rgb(255, 85, 255);">"1234-5678-9012-3456"</span>));
cart.checkout(<span class="hljs-number" style="color: rgb(255, 85, 255);">150.00</span>);
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Меняем способ оплаты на QR-код и снова совершаем платёж</span>
cart.setPaymentStrategy(<span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> QRCodePayment(<span class="hljs-string" style="color: rgb(255, 85, 255);">"QR1234567890"</span>));
cart.checkout(<span class="hljs-number" style="color: rgb(255, 85, 255);">75.50</span>);
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Интерфейс для способов оплаты</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">interface</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">PaymentStrategy</span> </span>{
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">pay</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(<span class="hljs-keyword" style="color: rgb(255, 255, 85);">double</span> amount)</span></span>; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Метод для выполнения платежа</span>
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Оплата банковской картой</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">CreditCardPayment</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">implements</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">PaymentStrategy</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">private</span> String cardNumber; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Номер карты</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">CreditCardPayment</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(String cardNumber)</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">this</span>.cardNumber = cardNumber;
}
<span class="hljs-meta" style="color: rgb(85, 255, 255);">@Override</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">pay</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(<span class="hljs-keyword" style="color: rgb(255, 255, 85);">double</span> amount)</span> </span>{
System.out.println(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Оплачено картой "</span> + cardNumber + <span class="hljs-string" style="color: rgb(255, 85, 255);">" на сумму: $"</span> + amount);
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Оплата по QR-коду</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">QRCodePayment</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">implements</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">PaymentStrategy</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">private</span> String qrCode; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Код для оплаты</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">QRCodePayment</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(String qrCode)</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">this</span>.qrCode = qrCode;
}
<span class="hljs-meta" style="color: rgb(85, 255, 255);">@Override</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">pay</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(<span class="hljs-keyword" style="color: rgb(255, 255, 85);">double</span> amount)</span> </span>{
System.out.println(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Оплачено по QR-коду "</span> + qrCode + <span class="hljs-string" style="color: rgb(255, 85, 255);">" на сумму: $"</span> + amount);
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Класс корзины покупок, который использует разные способы оплаты</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">ShoppingCart</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">private</span> PaymentStrategy paymentStrategy; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Выбранный способ оплаты</span>
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Устанавливаем стратегию оплаты</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">setPaymentStrategy</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(PaymentStrategy paymentStrategy)</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">this</span>.paymentStrategy = paymentStrategy;
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Выполняем оплату выбранным способом</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">checkout</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(<span class="hljs-keyword" style="color: rgb(255, 255, 85);">double</span> amount)</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">if</span> (paymentStrategy == <span class="hljs-keyword" style="color: rgb(255, 255, 85);">null</span>) {
System.out.println(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Ошибка: не выбран способ оплаты!"</span>);
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">return</span>;
}
paymentStrategy.pay(amount);
}
}</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">При запуске программы мы увидим, что она может успешно обрабатывать платежи обоими способами через единый интерфейс <u class="stk-reset">PaymentStrategy</u>:</p><figure class="stk-reset stk-embed_rendered stk-theme_26309__mb_15" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(170, 170, 170);">Оплачено картой <span class="hljs-number" style="color: rgb(255, 85, 255);">1234-5678</span>-<span class="hljs-number" style="color: rgb(255, 85, 255);">9012-3456</span> на сумму: $<span class="hljs-number" style="color: rgb(255, 85, 255);">150</span>.<span class="hljs-number" style="color: rgb(255, 85, 255);">0</span>
Оплачено по QR-коду QR<span class="hljs-number" style="color: rgb(255, 85, 255);">1234567890</span> на сумму: $<span class="hljs-number" style="color: rgb(255, 85, 255);">75</span>.<span class="hljs-number" style="color: rgb(255, 85, 255);">5</span></pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><h3 class="stk-theme_26309__style_medium_header stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph" id="stk-13"><strong class="stk-reset">«Наблюдатель» (Observer)</strong></h3><p class="stk-reset" data-ce-tag="paragraph">Паттерн «Наблюдатель» — это способ организации связи между объектами по принципу «один ко многим». Его суть проста: когда основной объект (субъект) меняет своё состояние, все зависимые объекты (наблюдатели) автоматически получают уведомление и обновляются. Наблюдателей можно свободно добавлять или удалять в любой момент, когда это необходимо.</p><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">Возьмём в качестве примера систему уведомлений в социальной сети. Когда автор публикует новый пост, видео или фотографию, его подписчики сразу получают об этом уведомление. Теперь посмотрим, как это работает в Java.</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(170, 170, 170);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">import</span> java.util.ArrayList;
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">import</span> java.util.List;
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Интерфейс для наблюдателей</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">interface</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">Observer</span> </span>{
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">update</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(String message)</span></span>;
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Класс подписчика, который реализует интерфейс Observer</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">Subscriber</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">implements</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">Observer</span> </span>{
<span class="hljs-meta" style="color: rgb(85, 255, 255);">@Override</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">update</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(String message)</span> </span>{
System.out.println(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Подписчик получил обновление: "</span> + message);
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Класс субъекта, который меняет состояние и сообщает подписчикам</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">Subject</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">private</span> List<Observer> observers = <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> ArrayList<>();
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">private</span> String state;
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Метод для добавления подписчика в список</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">attach</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(Observer observer)</span> </span>{
observers.add(observer);
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Метод для уведомления всех подписчиков</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">notifyObservers</span><span class="hljs-params" style="color: rgb(136, 136, 255);">()</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">for</span> (Observer observer : observers) {
observer.update(state);
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Метод для изменения состояния</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">setState</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(String state)</span> </span>{
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">this</span>.state = state;
notifyObservers();
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Создаём объекты и запускаем процесс</span>
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">MainObserver</span> </span>{
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">static</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">main</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(String[] args)</span> </span>{
Subject subject = <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> Subject();
Subscriber subscriber = <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> Subscriber();
subject.attach(subscriber);
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Меняем состояние и уведомляем подписчика</span>
subject.setState(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Новость: состояние 1"</span>);
subject.setState(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Новость: состояние 2"</span>);
}
}</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">При вызове метода <u class="stk-reset" data-gtm-vis-has-fired10171822_255="1">setState()</u> субъект сразу уведомляет всех зарегистрированных наблюдателей о смене состояния через метод <u class="stk-reset" data-gtm-vis-has-fired10171822_255="1">notifyObservers()</u>. В ответ каждый наблюдатель выполняет метод <u class="stk-reset" data-gtm-vis-has-fired10171822_255="1">update()</u>, который в нашем примере выводит полученное сообщение в консоль:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(170, 170, 170);">Подписчик получил обновление: Новость: <span class="hljs-built_in" style="color: rgb(255, 85, 255);">состояние</span> <span class="hljs-number" style="color: rgb(255, 85, 255);">1</span>
Подписчик получил обновление: Новость: <span class="hljs-built_in" style="color: rgb(255, 85, 255);">состояние</span> <span class="hljs-number" style="color: rgb(255, 85, 255);">2</span></pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><div class="stk-grid__layout_reverse stk-grid valign-middle stk-theme_26309__mb_15" data-stk-css="stkJt8rB" data-ce-tag="grid"><div data-col-width="4" class="stk-grid-col stk-grid-col_last valign-middle" data-ce-tag="grid-col" data-stk-css="" data-stk-css-m=""><figure class="stk-reset stk-image-figure" data-ce-tag="image-figure"><div class="stk-mask" data-ce-tag="mask"><img src="/upload/setka_images/15331115032025_5fbb87e295c9b9f9aabf8f06ece94f32fd15c2bd.png" data-image-id="112510" data-image-name="rm3.png" class="stk-image stk-reset" width="372" height="200" loading="lazy"/></div></figure></div><div data-col-width="8" class="stk-grid-col valign-middle" data-ce-tag="grid-col"><p class="stk-reset stk-theme_26309__mb_05 stk-theme_26309__style_font_style-1629726727970" data-ce-tag="paragraph">Читайте также:</p><p class="stk-theme_26309__mb_15 stk-reset stk-theme_26309__style_font_style-1629786048064 stk-theme_26309__style_font_style-1629290372003 stk-theme_26309__color_26309_custom_color_1 article_incut" data-ce-tag="paragraph"><a href="https://skillbox.ru/media/base/shablon-nablyudatel-rasskazhite-kak-tam-na-marse/" target="_blank" class="stk-reset">Шаблон «Наблюдатель»: расскажите, как там на Марсе</a></p></div></div><h3 class="stk-theme_26309__style_medium_header stk-theme_26309__mb_05 stk-reset" id="stk-14" data-ce-tag="paragraph"><strong class="stk-reset">«Посетитель» (Visitor)</strong></h3><p class="stk-reset" data-ce-tag="paragraph">И последний шаблон на сегодня — «Посетитель». Он позволяет добавлять новую функциональность к классам без изменения их исходного кода. Это особенно ценно в проектах, где требуется регулярно внедрять новые операции в действующую систему, сохраняя при этом её стабильность.</p><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">Представьте программу для зоопарка с базой данных различных животных. Для их кормления можно создать класс «Кормильщик», который будет учитывать особенности питания каждого вида животных и не изменять код самих классов животных. Если в будущем нужно добавить функцию лечения, нам достаточно создать новый класс «Ветеринар», и он также не затронет текущий код. Для закрепления накормим домашних питомцев.</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(170, 170, 170);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">MainVisitor</span> </span>{
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">static</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">main</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(String[] args)</span> </span>{
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Создаём массив домашних животных</span>
Animal[] animals = {<span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> Cat(), <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> Dog()};
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Создаём посетителя, который будет кормить наших питомцев</span>
AnimalVisitor feedingVisitor = <span class="hljs-keyword" style="color: rgb(255, 255, 85);">new</span> FeedingVisitor();
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Для каждого животного вызываем метод accept, который передаёт посетителю текущее животное</span>
<span class="hljs-keyword" style="color: rgb(255, 255, 85);">for</span> (Animal animal : animals) {
animal.accept(feedingVisitor);
}
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Интерфейс для животных</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">interface</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">Animal</span> </span>{
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">accept</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(AnimalVisitor visitor)</span></span>; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Метод для принятия посетителя</span>
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Интерфейс для посетителей</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">interface</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">AnimalVisitor</span> </span>{
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">visit</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(Cat cat)</span></span>; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Метод для кошек</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">visit</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(Dog dog)</span></span>; <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Метод для собак</span>
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Класс кошки</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">Cat</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">implements</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">Animal</span> </span>{
<span class="hljs-meta" style="color: rgb(85, 255, 255);">@Override</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">accept</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(AnimalVisitor visitor)</span> </span>{
visitor.visit(<span class="hljs-keyword" style="color: rgb(255, 255, 85);">this</span>); <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Кошка передаёт себя посетителю</span>
}
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">meow</span><span class="hljs-params" style="color: rgb(136, 136, 255);">()</span> </span>{
System.out.println(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Мяу!"</span>); <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Кошка мяукает</span>
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Класс собаки</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">Dog</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">implements</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">Animal</span> </span>{
<span class="hljs-meta" style="color: rgb(85, 255, 255);">@Override</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">accept</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(AnimalVisitor visitor)</span> </span>{
visitor.visit(<span class="hljs-keyword" style="color: rgb(255, 255, 85);">this</span>); <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Собака передаёт себя посетителю</span>
}
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">bark</span><span class="hljs-params" style="color: rgb(136, 136, 255);">()</span> </span>{
System.out.println(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Гав!"</span>); <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Собака лает</span>
}
}
<span class="hljs-comment" style="color: rgb(85, 255, 255);">// Конкретный посетитель, который будет кормить животных</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">class</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">FeedingVisitor</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">implements</span> <span class="hljs-title" style="color: rgb(136, 136, 255);">AnimalVisitor</span> </span>{
<span class="hljs-meta" style="color: rgb(85, 255, 255);">@Override</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">visit</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(Cat cat)</span> </span>{
System.out.println(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Кошка покормлена!"</span>);
cat.meow(); <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Кошка мяукает после кормления</span>
}
<span class="hljs-meta" style="color: rgb(85, 255, 255);">@Override</span>
<span class="hljs-function" style="color: rgb(255, 255, 85);"><span class="hljs-keyword" style="color: rgb(255, 255, 85);">public</span> <span class="hljs-keyword" style="color: rgb(255, 255, 85);">void</span> <span class="hljs-title" style="color: rgb(170, 170, 170);">visit</span><span class="hljs-params" style="color: rgb(136, 136, 255);">(Dog dog)</span> </span>{
System.out.println(<span class="hljs-string" style="color: rgb(255, 85, 255);">"Собака покормлена!"</span>);
dog.bark(); <span class="hljs-comment" style="color: rgb(85, 255, 255);">// Собака лает после кормления</span>
}
}</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">При переборе массива каждое животное принимает посетителя через метод <u class="stk-reset" data-gtm-vis-has-fired10171822_255="1">accept()</u>. В свою очередь, посетитель вызывает соответствующий метод <u class="stk-reset" data-gtm-vis-has-fired10171822_255="1">visit()</u> для конкретного типа животного. В результате каждое животное получает порцию еды и выражает нам за это искреннюю благодарность:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(170, 170, 170);">Кошка покормлена!
Мяу!
Собака покормлена!
Гав!</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure></div></div><div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph" id="stk-15"><strong class="stk-reset">Что дальше</strong></h2><p class="stk-reset" data-ce-tag="paragraph">Сегодня вы в общих чертах познакомились с одной из обширных тем в мире программирования. Для более глубокого изучения рекомендуем книгу «<a class="stk-reset" data-gtm-vis-has-fired10171822_255="1" href="https://www.piter.com/collection/all/product/patterny-obektno-orientirovannogo-proektirovaniya" target="_blank">Приёмы объектно-ориентированного проектирования</a>» — классическое руководство по этой теме. В народе её авторов — Эриха Гамму, Ричарда Хелма, Ральфа Джонсона и Джона Влиссидеса — называют «Банда четырёх». В книге подробно разобраны 23 паттерна проектирования, с описанием их возможностей и ограничений.</p><p class="stk-reset" data-ce-tag="paragraph">После изучения классики рекомендуем обратиться к книге «<a href="https://www.piter.com/collection/head-first-oreilly/product/head-first-patterny-proektirovaniya-2-e-izdanie" target="_blank" class="stk-reset">Head First. Паттерны проектирования</a>». В ней представлен современный взгляд на 14 основных паттернов через понятные жизненные примеры и наглядные иллюстрации. Авторы книги — новая «банда четырёх»: Эрик Фримен, Элизабет Робсон, Кэти Сьерра и Берт Бейтс. Также советуем заглянуть на сайт <a href="https://refactoringguru.cn/ru" target="_blank" class="stk-reset">Refactoring.Guru</a>, где собраны 22 паттерна с примерами и псевдокодом.</p></div></div><div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><div class="stk-grid stk-grid__layout_columns stk-theme_26309__mb_15" data-stk-css="stk6ZiIL" data-ce-tag="grid"><div data-col-width="1" class="stk-grid-col align-left valign-top stk-mobile-hidden" data-ce-tag="grid-col" data-stk-css="" data-stk-css-m=""><a class="sklbx-link sklbx-link--fb stk-container stk-container-link stk-reset" data-ce-tag="container" data-container-name="Telegram" href="https://t.me/skillbox_media_code" target="_blank"><svg class="sklbx-link__icon" width="25" height="20" xmlns="http://www.w3.org/2000/svg">
<path d="m9.417 15.181-.397 5.584c.568 0 .814-.244 1.109-.537l2.663-2.545 5.518 4.041c1.012.564 1.725.267 1.998-.931l3.622-16.972.001-.001c.321-1.496-.541-2.081-1.527-1.714l-21.29 8.151c-1.453.564-1.431 1.374-.247 1.741l5.443 1.693 12.643-7.911c.595-.394 1.136-.176.691.218z" fill-rule="evenodd"></path>
</svg></a></div><div data-col-width="11" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><p class="stk-reset stk-theme_26309__mb_05 stk-theme_26309__style_font_style-1629786048064" data-ce-tag="paragraph" data-stk-css="stkpBng2">Больше интересного про код — в нашем <a class="stk-reset" href="https://t.me/skillbox_media_code" target="_blank">телеграм-канале</a>. Подписывайтесь!</p></div></div><div class="stk-grid" data-ce-tag="grid" data-stk-css="stki6rDQ"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col" data-stk-css="" data-stk-css-m=""><p class="stk-reset stk-theme_26309__style_small_text stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">Читайте также:</strong></p><ul class="stk-theme_26309__style_small_text stk-theme_26309__mb_05 stk-theme_26309__pad_hor_1 stk-reset" data-ce-tag="list"><li class="stk-theme_26309__style_small_text stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://skillbox.ru/media/code/java-core-dlya-novichkov-roadmap/" target="_blank" class="stk-reset">Java Core для новичков: роадмап</a></li><li class="stk-theme_26309__style_small_text stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://skillbox.ru/media/code/oop_chast_1_chto_takoe_klassy_i_obekty/" target="_blank" class="stk-reset">Что такое объекты и классы: 1‑я часть гайда по ООП</a></li><li class="stk-theme_26309__style_small_text stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://skillbox.ru/media/code/kak-sproektirovat-arkhitekturu-prilozheniya-s-nulya/" target="_blank" class="stk-reset">Как спроектировать архитектуру приложения с нуля</a></li></ul></div></div></div></div><style data-stk-css="stki6rDQ" media="all" class="">
[data-stk-css="stki6rDQ"]:not(#stk):not(#stk):not(style) {
padding: 20px;
background-color: rgba(254, 245, 224, 1)
}
</style><style data-stk-css="stk6ZiIL" class="" media="all">
[data-stk-css="stk6ZiIL"]:not(#stk):not(#stk):not(style) {
border-radius: 16px;
padding: 20px;
border: 1px solid;
border-color: #E4E4E4;
background-color: rgba(241, 242, 246, 1)
}
</style><style data-stk-css="stkpBng2" class="" media="all">
[data-stk-css="stkpBng2"]:not(#stk):not(#stk):not(style) {
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
-o-hyphens: none;
hyphens: none
}
</style><style data-stk-css="stkJt8rB" class="" media="all">
[data-stk-css="stkJt8rB"]:not(#stk):not(#stk):not(style) {
border-radius: 16px;
padding: 40px;
border: 1px solid;
background-color: rgba(255, 255, 255, 1);
border-color: #E4E4E4;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
}
</style><style data-stk-css="stknjGkh" class="" media="all">
[data-stk-css="stknjGkh"]:not(#stk):not(#stk):not(style) {
border-radius: 16px;
padding: 40px;
border: 1px solid;
background-color: rgba(255, 255, 255, 1);
border-color: #E4E4E4;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
}
</style><style data-stk-css="stkRLueu" class="" media="all">
[data-stk-css="stkRLueu"]:not(#stk):not(#stk):not(style) {
border-radius: 16px;
padding: 40px;
border: 1px solid;
background-color: rgba(255, 255, 255, 1);
border-color: #E4E4E4;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
}
</style><style data-stk-css="stkl0i3V" media="all" class="">
[data-stk-css="stkl0i3V"]:not(#stk):not(#stk):not(style) {
border-left: 4px solid #f5a74f;
padding: 20px;
background-color: rgba(241, 242, 246, 1)
}
</style><style data-stk-css="stkwx9Ew" class="" media="all">[data-stk-css="stkwx9Ew"]:not(#stk):not(#stk):not(style){margin-left: 40px}</style><style data-stk-css="stk0eajB" class="" media="all">[data-stk-css="stk0eajB"]:not(#stk):not(#stk):not(style){margin-left: 40px}</style><style data-stk-css="stkGcd4Q" class="" media="all">[data-stk-css="stkGcd4Q"]:not(#stk):not(#stk):not(style){margin-left: 40px}</style><div class="stk-footnote stk-footnote--hide" data-stk-show="mouseover" data-stk-footnote-body="fnWAOf0" data-ce-tag="footnote" style="display:none"><div class="stk-footnote__close"></div><div class="stk-footnote__body"><p class="stk-theme_26309__style_small_text stk-reset" data-ce-tag="paragraph">Под термином «Фабрика» мы подразумеваем общее название для группы паттернов, которые связаны с созданием объектов. В эту группу входят: «Простая фабрика», «Фабричный метод» и «Абстрактная фабрика».</p></div></div><div class="stk-footnote stk-footnote--hide" data-stk-show="mouseover" data-stk-footnote-body="fnt1cQI" data-ce-tag="footnote" style="display:none"><div class="stk-footnote__close"></div><div class="stk-footnote__body"><p class="stk-theme_26309__style_small_text stk-reset" data-ce-tag="paragraph">Инкапсулирует — значит скрывает внутренние детали реализации, предоставляя только необходимый интерфейс. Например, вам не нужно понимать, как устроен пульт от телевизора — достаточно нажать кнопку, чтобы переключить канал. Точно так же паттерн «Фабрика» скрывает сложную логику создания объектов за простым вызовом метода.</p></div></div></div> </div>
</div>
</div>
</div>
<div class="col-xl-9 col-lg-8 col-poster">
<div class="article-preview-info">
</div>
</div>
<noindex>
<div class="share" data-nosnippet>
<button class="share__handler-btn ">
<span class="share__handler-icon">
<svg width="11" height="12" viewBox="0 0 11 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11 4.99902L6 0V2.99805C2.688 2.99805 0 5.68505 0 8.99805V11.498H0.0980225C0.765022 8.91205 3.107 6.99805 5.901 6.99805H6.00098V9.99805L11 4.99902Z" fill="currentColor"/>
</svg>
</span>
<span class="share__handler-text">Поделиться</span>
</button>
<div class="share__list">
<a href="#" class="share__item" data-code="vk">
<span class="share__item-icon share__item-icon--vk">
<svg width="9" height="5" viewBox="0 0 9 5" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M4.04776 4.98054H4.53996C4.62377 4.97136 4.70279 4.9361 4.76621 4.87951C4.81226 4.81209 4.83594 4.73139 4.83369 4.64925C4.83369 4.64925 4.82574 3.94629 5.1314 3.84125C5.43701 3.73621 5.826 4.51998 6.23879 4.82297C6.39281 4.95308 6.59128 5.01558 6.79053 4.99669L7.89399 4.98054C7.89399 4.98054 8.47355 4.94415 8.19965 4.46339C7.98372 4.08315 7.70589 3.743 7.37799 3.45744C6.68338 2.77872 6.77865 2.8878 7.61219 1.71216C8.12024 0.997077 8.32269 0.556717 8.25918 0.370875C8.14651 0.254767 7.98299 0.205914 7.82655 0.241594L6.58018 0.249674C6.52565 0.241067 6.46984 0.251007 6.42141 0.277954C6.37298 0.314507 6.33466 0.363228 6.31025 0.419356C6.18259 0.772814 6.0287 1.11586 5.8498 1.44552C5.29807 2.43936 5.07579 2.49188 4.98451 2.43128C4.77416 2.28584 4.82574 1.85356 4.82574 1.54248C4.82574 0.580957 4.96468 0.176954 4.55979 0.0719133C4.36879 0.0254376 4.17259 0.00505841 3.97631 0.0113129C3.62834 -0.0214164 3.27745 0.017045 2.94429 0.124433C2.8014 0.197154 2.69423 0.358753 2.76171 0.370875C2.90334 0.385518 3.03406 0.454932 3.12688 0.564795C3.21268 0.750336 3.25481 0.953675 3.24993 1.15868C3.24993 1.15868 3.32535 2.29392 3.07925 2.43532C2.91254 2.53228 2.68232 2.33432 2.18616 1.4334C2.01958 1.11848 1.87243 0.793298 1.74557 0.459754C1.72231 0.404013 1.68704 0.354309 1.64236 0.314316C1.58589 0.272672 1.52066 0.245006 1.45184 0.233514L0.268986 0.241594C0.181167 0.241154 0.0958013 0.271066 0.0268587 0.326434C-0.00595087 0.396174 -0.00882613 0.476652 0.0189202 0.548633C0.0189202 0.548633 0.947737 2.83932 1.99563 3.99477C2.51 4.60651 3.2568 4.96526 4.04776 4.98054Z" fill="white"/>
</svg>
</span>
<span class="share__item-text">Vkontakte</span>
</a>
<a href="#" class="share__item" data-code="tw">
<span class="share__item-icon share__item-icon--tw">
<svg width="9" height="7" viewBox="0 0 9 7" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.52788 0.00144284V0H5.9158L6.05754 0.027414C6.15204 0.0452114 6.23783 0.068535 6.31491 0.0973918C6.39201 0.126249 6.46661 0.159917 6.53872 0.198391C6.61083 0.236864 6.67623 0.276066 6.73492 0.315982C6.79311 0.355422 6.84533 0.397265 6.89158 0.441509C6.93733 0.486237 7.0087 0.49778 7.10568 0.476138C7.20266 0.454495 7.3071 0.424433 7.419 0.38596C7.5309 0.347487 7.64156 0.304201 7.75097 0.256104C7.86039 0.208007 7.92703 0.177469 7.95091 0.164484C7.97428 0.151022 7.98671 0.143808 7.98821 0.142841L7.98969 0.140677L7.99715 0.13707L8.00461 0.133463L8.01207 0.129856L8.01953 0.126249L8.02102 0.124084L8.02326 0.122642L8.02551 0.121199L8.02699 0.119034L8.03445 0.11687L8.04191 0.115427L8.04043 0.126249L8.03818 0.13707L8.03445 0.147891L8.03072 0.158713L8.02699 0.165927L8.02326 0.173141L8.01953 0.183962C8.01705 0.191176 8.01456 0.200793 8.01207 0.212819C8.00959 0.224845 7.98596 0.272935 7.9412 0.357103C7.89644 0.441271 7.84049 0.526637 7.77335 0.613208C7.70621 0.699778 7.64604 0.765182 7.59283 0.809434C7.53911 0.854162 7.50355 0.885421 7.48614 0.903219C7.46874 0.921492 7.4476 0.938323 7.42273 0.953718L7.38543 0.977525L7.37797 0.981132L7.37051 0.984739L7.36902 0.986903L7.36678 0.988346L7.36454 0.989789L7.36305 0.991953L7.35559 0.99556L7.34813 0.999168L7.34664 1.00133L7.3444 1.00277L7.34216 1.00422L7.34067 1.00638L7.33918 1.00855L7.33694 1.00999L7.3347 1.01143L7.33321 1.0136H7.37051L7.57939 0.970311C7.71865 0.941454 7.85168 0.906588 7.9785 0.865705L8.17992 0.800777L8.2023 0.793563L8.21349 0.789956L8.22095 0.786348L8.22841 0.782741L8.23587 0.779134L8.24333 0.775527L8.25825 0.773363L8.27317 0.77192V0.786348L8.26944 0.787791L8.26571 0.789956L8.26423 0.79212L8.26198 0.793563L8.25974 0.795006L8.25825 0.79717L8.25677 0.799334L8.25452 0.800777L8.25228 0.80222L8.25079 0.804384L8.24931 0.806548L8.24706 0.807991L8.24333 0.815205L8.2396 0.82242L8.23736 0.823862C8.23637 0.825305 8.20479 0.866181 8.14262 0.946504C8.08046 1.0273 8.04689 1.06818 8.04191 1.06915C8.03694 1.07059 8.02997 1.0778 8.02102 1.09079C8.01257 1.10425 7.95985 1.15788 7.86287 1.25166C7.76589 1.34545 7.67091 1.42889 7.57791 1.502C7.48441 1.57558 7.43716 1.666 7.43616 1.77325C7.43467 1.88002 7.42895 2.00074 7.419 2.13541C7.40905 2.27007 7.3904 2.41555 7.36305 2.57186C7.3357 2.72817 7.29342 2.90492 7.23623 3.10211C7.17904 3.29929 7.10941 3.49168 7.02735 3.67925C6.94529 3.86681 6.8595 4.03514 6.76998 4.18424C6.68046 4.33334 6.5984 4.45958 6.5238 4.56299C6.4492 4.66639 6.37336 4.76378 6.29626 4.85516C6.21918 4.94654 6.12171 5.04947 6.00384 5.16393C5.88547 5.27791 5.82082 5.34044 5.80988 5.3515C5.79844 5.36208 5.74971 5.40152 5.66365 5.46981C5.57812 5.53858 5.48611 5.60736 5.38763 5.67614C5.28966 5.74443 5.19964 5.80143 5.11758 5.84711C5.03552 5.8928 4.93655 5.94498 4.82067 6.00366C4.70529 6.06282 4.58046 6.11765 4.44618 6.16815C4.3119 6.21865 4.17016 6.26554 4.02096 6.30882C3.87176 6.35211 3.72753 6.38578 3.58827 6.40982C3.44903 6.43387 3.29112 6.45431 3.11456 6.47114L2.84973 6.49639V6.5H2.36483V6.49639L2.30142 6.49279C2.25915 6.49038 2.22433 6.48797 2.19698 6.48557C2.16963 6.48317 2.06643 6.46994 1.88739 6.44589C1.70835 6.42185 1.56785 6.3978 1.4659 6.37375C1.36395 6.34971 1.21225 6.30401 1.01083 6.23668C0.809413 6.16935 0.637087 6.10129 0.493854 6.03252C0.351121 5.96422 0.261601 5.92094 0.225293 5.90266C0.189485 5.88487 0.149201 5.86275 0.10444 5.83629L0.0373001 5.79661L0.0358156 5.79445L0.0335701 5.79301L0.0313321 5.79156L0.0298401 5.7894L0.0223801 5.78579L0.0149201 5.78219L0.0134355 5.78002L0.01119 5.77858L0.00895204 5.77714L0.00746003 5.77497L0.00597548 5.77281L0.00373001 5.77137H0V5.75694L0.00746003 5.75838L0.0149201 5.76054L0.0484902 5.76415C0.0708703 5.76655 0.131796 5.77016 0.231261 5.77497C0.330733 5.77978 0.436412 5.77978 0.548312 5.77497C0.660213 5.77016 0.774605 5.75934 0.891474 5.74251C1.00835 5.72568 1.14636 5.69682 1.30551 5.65594C1.46466 5.61505 1.61087 5.56648 1.74416 5.51021C1.87695 5.45346 1.97144 5.41114 2.02764 5.38324C2.08334 5.35583 2.16838 5.30484 2.28277 5.2303L2.45435 5.11848L2.45584 5.11632L2.45808 5.11487L2.46033 5.11343L2.46181 5.11127L2.4633 5.1091L2.46554 5.10766L2.46779 5.10622L2.46927 5.10405L2.47673 5.10189L2.48419 5.10044L2.48568 5.09323L2.48792 5.08602L2.49017 5.08457L2.49165 5.08241L2.43197 5.0788C2.39219 5.0764 2.35364 5.07399 2.31634 5.07159C2.27904 5.06918 2.2206 5.05836 2.14103 5.03912C2.06146 5.01988 1.97567 4.99103 1.88366 4.95255C1.79165 4.91408 1.70213 4.86838 1.6151 4.81548C1.52807 4.76258 1.46515 4.71857 1.42636 4.68346C1.38807 4.64883 1.33833 4.59978 1.27716 4.53629C1.21648 4.47233 1.16376 4.40668 1.119 4.33934C1.07424 4.27202 1.03148 4.19433 0.990699 4.10633L0.928774 3.97503L0.925044 3.96421L0.921314 3.95339L0.919076 3.94617L0.917584 3.93896L0.928774 3.9404L0.939964 3.94256L1.02202 3.95339C1.07674 3.9606 1.16253 3.963 1.27939 3.9606C1.39627 3.9582 1.47709 3.95339 1.52185 3.94617C1.56661 3.93896 1.59396 3.93414 1.60391 3.93174L1.61883 3.92814L1.63748 3.92453L1.65613 3.92092L1.65762 3.91876L1.65986 3.91731L1.6621 3.91587L1.66359 3.91371L1.64867 3.9101L1.63375 3.90649L1.61883 3.90289L1.60391 3.89928L1.58899 3.89567C1.57904 3.89327 1.56164 3.88846 1.53677 3.88124C1.5119 3.87403 1.44476 3.84757 1.33535 3.80189C1.22594 3.7562 1.1389 3.71171 1.07424 3.66842C1.00943 3.62501 0.947626 3.57754 0.889235 3.5263C0.831047 3.47436 0.767145 3.40751 0.697513 3.32575C0.627888 3.24399 0.565724 3.149 0.511012 3.04079C0.456308 2.93257 0.415277 2.82917 0.387922 2.73058C0.360676 2.63256 0.3427 2.53235 0.334217 2.43119L0.320781 2.27969L0.328241 2.28113L0.335701 2.2833L0.343161 2.2869L0.350621 2.29051L0.358081 2.29412L0.365541 2.29772L0.481172 2.34822C0.558264 2.38189 0.653998 2.41075 0.768383 2.43479C0.882775 2.45884 0.951154 2.47207 0.973534 2.47447L1.0071 2.47808H1.07424L1.07276 2.47592L1.07051 2.47447L1.06828 2.47303L1.06678 2.47087L1.0653 2.4687L1.06305 2.46726L1.06082 2.46582L1.05932 2.46365L1.05186 2.46004L1.0444 2.45644L1.04292 2.45427L1.04067 2.45283L1.03844 2.45139L1.03694 2.44922L1.02948 2.44562L1.02202 2.44201L1.02054 2.43984C1.01905 2.43888 0.99766 2.42349 0.956376 2.39367C0.915592 2.36337 0.872823 2.32418 0.828063 2.27608C0.783303 2.22798 0.738543 2.17749 0.693783 2.12458C0.64894 2.07156 0.609 2.01483 0.574422 1.95505C0.539614 1.89493 0.502806 1.81846 0.464014 1.72564C0.425721 1.6333 0.396627 1.54023 0.376731 1.44645C0.356843 1.35266 0.345653 1.26008 0.343161 1.1687C0.340677 1.07732 0.343161 0.999168 0.350621 0.93424C0.358081 0.869312 0.373001 0.795965 0.395382 0.714206C0.417762 0.632448 0.450093 0.545877 0.492362 0.454495L0.555772 0.317425L0.559502 0.306604L0.563232 0.295782L0.565478 0.29434L0.566962 0.292175L0.568454 0.290011L0.570692 0.288568L0.572938 0.290011L0.574422 0.292175L0.575914 0.29434L0.578152 0.295782L0.580398 0.297225L0.581882 0.29939L0.583374 0.301554L0.585612 0.302997L0.589342 0.310211L0.593072 0.317425L0.595318 0.318868L0.596802 0.321032L0.697513 0.429245C0.764653 0.501387 0.844229 0.581948 0.936234 0.670921C1.02825 0.759894 1.07922 0.806065 1.08916 0.809434C1.09912 0.813279 1.11154 0.824338 1.12646 0.842619C1.14138 0.860417 1.19112 0.902981 1.27567 0.970311C1.36022 1.03764 1.47087 1.1158 1.60764 1.20477C1.74441 1.29375 1.89609 1.38152 2.0627 1.46809C2.22931 1.55466 2.40835 1.63281 2.59982 1.70255C2.7913 1.77229 2.92558 1.81798 3.00266 1.83962C3.07975 1.86127 3.21154 1.88892 3.39804 1.92259C3.58454 1.95625 3.72505 1.9779 3.81954 1.98751C3.91403 1.99713 3.97869 2.00266 4.0135 2.00411L4.06572 2.00555L4.06423 1.99473L4.06199 1.98391L4.04707 1.89373C4.03712 1.83361 4.03215 1.74944 4.03215 1.64123C4.03215 1.53302 4.04085 1.43322 4.05826 1.34184C4.07567 1.25046 4.10178 1.15788 4.13659 1.0641C4.1714 0.970311 4.20547 0.895038 4.23879 0.838291C4.27261 0.78202 4.31687 0.717814 4.37158 0.645671C4.42629 0.573529 4.49716 0.498985 4.58419 0.422031C4.67122 0.345077 4.77069 0.276542 4.88259 0.216426C4.99449 0.15631 5.09769 0.110615 5.19218 0.0793563C5.28668 0.0480971 5.36625 0.0276521 5.4309 0.0180355C5.49556 0.00841898 5.52788 0.00288568 5.52788 0.00144284Z" fill="white"/>
</svg>
</span>
<span class="share__item-text">Twitter</span>
</a>
<a href="#" class="share__item" data-code="tg">
<span class="share__item-icon share__item-icon--tg">
<svg width="10" height="7" viewBox="0 0 10 7" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.39589 3.04852C1.39589 3.04852 5.05491 1.51189 6.32392 0.9708C6.8104 0.754384 8.46012 0.0617918 8.46012 0.0617918C8.46012 0.0617918 9.22155 -0.241191 9.15809 0.494655C9.13692 0.797667 8.96773 1.85815 8.79854 3.00523C8.54472 4.62846 8.26976 6.40316 8.26976 6.40316C8.26976 6.40316 8.22746 6.90097 7.86791 6.98753C7.50836 7.0741 6.91613 6.68455 6.8104 6.59795C6.72577 6.53304 5.22411 5.5591 4.6742 5.08295C4.52614 4.9531 4.35695 4.6934 4.69533 4.39039C5.45676 3.67617 6.36622 2.78882 6.91613 2.2261C7.16995 1.96638 7.42374 1.36038 6.36622 2.09622C4.86456 3.15674 3.38403 4.15231 3.38403 4.15231C3.38403 4.15231 3.04561 4.36873 2.41111 4.17394C1.77657 3.97918 1.03631 3.71945 1.03631 3.71945C1.03631 3.71945 0.528726 3.39481 1.39589 3.04852Z" fill="white"/>
</svg>
</span>
<span class="share__item-text">Telegram</span>
</a>
<a href="#" class="share__item js-share-item-copy">
<span class="share__item-icon share__item-icon--copy">
<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.19922 5.40327C4.37217 5.63449 4.59283 5.8258 4.84622 5.96425C5.09962 6.10269 5.37982 6.18501 5.66783 6.20564C5.95584 6.22627 6.24492 6.18471 6.51546 6.08379C6.78599 5.98287 7.03166 5.82495 7.2358 5.62074L8.44399 4.41255C8.81079 4.03277 9.01375 3.52412 9.00917 2.99615C9.00458 2.46818 8.79281 1.96313 8.41946 1.58978C8.04611 1.21644 7.54106 1.00466 7.01309 1.00008C6.48512 0.995488 5.97647 1.19845 5.59669 1.56525L4.904 2.25392" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M5.81002 4.59658C5.63707 4.36536 5.41641 4.17404 5.16302 4.0356C4.90962 3.89716 4.62942 3.81483 4.34141 3.79421C4.0534 3.77358 3.76432 3.81514 3.49379 3.91605C3.22325 4.01697 2.97758 4.17489 2.77344 4.3791L1.56525 5.58729C1.19845 5.96707 0.995488 6.47572 1.00008 7.0037C1.00466 7.53167 1.21644 8.03672 1.58978 8.41006C1.96313 8.78341 2.46818 8.99518 2.99615 8.99977C3.52412 9.00436 4.03277 8.80139 4.41255 8.43459L5.10122 7.74592" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
<span class="share__item-text">Скопировать ссылку</span>
</a>
</div>
</div>
</noindex>
</div>
<section class="container inset" data-banner="223466" data-source="222898" data-format="horizontal">
<section class="container inset" data-format="horizontal">
<div class="row">
<div class="col-lg-8 col-sm-12">
<a data-source="222898" data-banner="223466" target="_blank" href="https://skillbox.ru/course/profession-java/" class="article-advert-banner__link courseLink" data-format="horizontal" data-type="horizontal" data-courseid="3254">
<div class="inset__wrapper" style="background-color: #BDDAEC;">
<div class="inset__content">
<h2 class="inset__header">Курс с помощью в трудоустройстве</h2>
<p class="inset__description">
Профессия Java-разработчик + ИИ
</p>
<ul class="inset__text" style="color:#000!important; list-style:'\2022 ' outside; margin-left:20px;">
<li style="list-style:'\2022 '; padding-left:10px; margin-bottom:6px">
Свободный график обучения</li>
<li style="list-style:'\2022 '; padding-left:10px; margin-bottom:6px">
Курс на 80% состоит из практики</li>
<li style="list-style:'\2022 '; padding-left:10px; margin-bottom:6px">
Нейросети в программе, чтобы быстрее писать и проверять код</li>
</ul>
<p class="inset__button article-advert-banner__link">
Подробнее
</p>
</div>
<div class="inset__image">
<img width="250" src="https://cdn.skillbox.pro/landgen/blocks/start-screen/384985/lg/b1d1fd93-6ae3-42eb-acf9-15ca4d0c26d1.webp" height="250" alt="">
</div>
</div>
</a>
</div>
</div>
</section> </section>
</section>
<div class="article-banner" data-banner="219298" data-source="222898" data-format="vertical" data-type="vertical">
<div class="row">
<div class="col-sm-4 col-sm-12">
<div class="inset__wrapper" style="background-color:#f2eeff;">
<div class="inset__content" >
<div class="inset__image" style="text-align: top;">
<img src="https://skillbox.ru/upload/setka_images/math-side.png" width="150" height="150" alt="">
</div>
<p class="inset__description" style="color:#000!important; padding-bottom:13px;">
Изучайте IT на практике — бесплатно</p>
<p class="inset__text" style="color:#000!important">
Курсы за <del>2990</del> 0 р. </p>
<ul class="inset__content" style="color:#007bff!important; list-style:'\2713 ' outside; margin-left:13px;">
<li style="list-style:'\2713 '; padding-left:2px; margin-bottom:6px">
<a data-source="222898" data-banner="219298" href="https://bootcamp.skillbox.ru/python-short/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_invite_bootcamp-617_all_code_skillbox" target="_blank">Python</a>
</li>
<li style="list-style:'\2713 '; padding-left:2px; margin-bottom:6px">
<a href="https://bootcamp.skillbox.ru/qa-start/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_invite_bootcamp-655_all_code_skillbox" target="_blank">Тестирование</a>
</li>
<li style="list-style:'\2713 '; padding-left:2px; margin-bottom:6px">
<a href="https://bootcamp.skillbox.ru/data-science/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_invite_bootcamp-675_all_code_skillbox" target="_blank">Data Science</a>
</li>
<li style="list-style:'\2713 '; padding-left:2px; margin-bottom:6px">
<a href="https://bootcamp.skillbox.ru/java/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_invite_bootcamp-682_all_code_skillbox" target="_blank">Java</a>
</li>
<li style="list-style:'\2713 '; padding-left:2px; margin-bottom:6px">
<a href="https://bootcamp.skillbox.ru/sql/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_invite_bootcamp-695_all_code_skillbox" target="_blank">SQL и работа с данными</a>
</li>
</ul>
<a href="https://bootcamp.skillbox.ru/it-jobs/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_invite_bootcamp-759_all_code_skillbox" class="inset__button article-advert-banner__link" target="_blank" style="color:#000; background-color:#ffafff">Я не знаю, с чего начать</a>
</div>
</div>
</div>
</div> </div>
<a data-source="222898" data-banner="223376" target="_blank" href="https://skillbox.ru/course/profession-java/" class="article-banner article-advert-banner__link courseLink" style="background-color: #E9E9F5;" data-format="top" data-type="top" data-courseid="3522">
<div class="article-banner__img">
<img src="https://cdn.skillbox.pro/landgen/blocks/market/385163/lg/24f0f2c3-860c-4d7e-9ad0-1b65adf3f355.webp" alt="">
</div>
<span class="article-banner__title">Курс с трудоустройством: «<u>Профессия Java-разработчик + ИИ</u>»</span>
<span class="article-banner__link">Узнать о курсе</span>
</a>
<section class="container news">
<div class="row">
<div class="col-lg-8 col-sm-12">
<h2 class="news__header">Новости</h2>
<div class="row">
<div class="col-xl-4 col-lg-6 col-md-4 col-12 news__item">
<a href="/media/code/google-predstavil-gemini-31-pro-s-uluchshennymi-rassuzhdeniyami/" class="news__text">
Google представил Gemini 3.1 Pro с улучшенными рассуждениями </a>
<span class="news__date">20 фев 2026</span>
</div>
<div class="col-xl-4 col-lg-6 col-md-4 col-12 news__item">
<a href="/media/code/xai-dobavila-v-grok-multiagentnuyu-sistemu-s-chetyrmya-pomoschnikami/" class="news__text">
xAI добавила в Grok мультиагентную систему с четырьмя помощниками </a>
<span class="news__date">18 фев 2026</span>
</div>
<div class="col-xl-4 col-lg-6 col-md-4 col-12 news__item">
<a href="/media/code/openai-predstavila-gpt-53-codex-spark-prodvinutuyu-model-dlya-programmistov/" class="news__text">
OpenAI представила GPT-5.3-Codex-Spark — продвинутую модель для программистов </a>
<span class="news__date">13 фев 2026</span>
</div>
</div>
</div>
</div>
</section>
<div class="slider-news-wrap media-catalog-content media-catalog-content--interesting">
<div class="container">
<div class="slider-news slider-news--article-slider js-slider-news">
<div class="slider-news__header">
<div class="slider-news__title" style="font-family: 'Graphik'; font-weight: 500;">
<span class="slider-news__title-notmob">Это интересно</span>
<span class="slider-news__title-mob">Это интересно</span>
</div>
<div class="slider-news__nav-wrapper">
<div class="slider-news__nav-button button-prev swiper-button-disabled" tabindex="0" role="button" aria-label="Previous slide" aria-disabled="true">
<svg viewBox="0 0 9 15" width="9" height="15" class="icon">
<use xlink:href="/static/svg/svg-symbols-site.svg#icon-arrow-chevron" href="/static/svg/svg-symbols-site.svg#icon-arrow-chevron"></use>
</svg>
</div>
<div class="slider-news__nav-button button-next" tabindex="0" role="button" aria-label="Next slide" aria-disabled="false">
<svg viewBox="0 0 9 15" width="9" height="15" class="icon">
<use xlink:href="/static/svg/svg-symbols-site.svg#icon-arrow-chevron" href="/static/svg/svg-symbols-site.svg#icon-arrow-chevron"></use>
</svg>
</div>
</div>
</div>
<div class="slider-news__carousel grad-end">
<div class="slider-news__container swiper-container swiper-container-initialized swiper-container-horizontal">
<div class="swiper-wrapper">
<div class="slider-news__slide swiper-slide swiper-slide-active" style="margin-right: 20px;">
<div class="news-block__item">
<div class="news-block__img" style="margin-bottom: 8px;">
<picture>
<img src="https://248006.selcdn.ru/main/iblock/f1f/f1f05b73644b83a05ad3685325a98308/1668de27023f167b5952dda8f6448bab.jpg">
</picture> </div>
<a href="/media/code/chto-takoe-big-data/" class="news-block__title" style="font-family: 'Graphik'; font-size: 14px; line-height: 19px; -webkit-line-clamp: 4; font-weight: 500">
Big data: что такое большие данные и как с ними работать </a>
</div>
</div>
<div class="slider-news__slide swiper-slide swiper-slide-active" style="margin-right: 20px;">
<div class="news-block__item">
<div class="news-block__img" style="margin-bottom: 8px;">
<picture>
<img src="https://248006.selcdn.ru/main/iblock/ea6/ea6a8323236c2561837dabaf3aaf6301/b1321ab07a64d09d9eba7a802ff1a19d.jpg">
</picture> </div>
<a href="/media/code/google-v-fevrale-2026-goda-vekovye-obligacii-privatnost-v-poiske-i-webmcp-dlya-agentov/" class="news-block__title" style="font-family: 'Graphik'; font-size: 14px; line-height: 19px; -webkit-line-clamp: 4; font-weight: 500">
Google в феврале 2026 года: вековые облигации, приватность в поиске и WebMCP для агентов </a>
</div>
</div>
<div class="slider-news__slide swiper-slide swiper-slide-active" style="margin-right: 20px;">
<div class="news-block__item">
<div class="news-block__img" style="margin-bottom: 8px;">
<picture>
<img src="https://248006.selcdn.ru/main/iblock/83f/83f5fbe33b9cb70f84fd1bade3ba0200/5fec158e3ca8709d41cf5f5a4a0b8430.png">
</picture> </div>
<a href="/media/code/razrabotchiki-skupayut-mac-mini-na-it-rynke-peregrev-a-iz-tyurmy-vyshel-izvestnyy-kriptohaker/" class="news-block__title" style="font-family: 'Graphik'; font-size: 14px; line-height: 19px; -webkit-line-clamp: 4; font-weight: 500">
Разработчики скупают Mac mini, на IT-рынке перегрев, а из тюрьмы вышел известный хакер </a>
</div>
</div>
<div class="slider-news__slide swiper-slide swiper-slide-active" style="margin-right: 20px;">
<div class="news-block__item">
<div class="news-block__img" style="margin-bottom: 8px;">
<picture>
<img src="https://248006.selcdn.ru/main/iblock/080/080d477242b414a3d2964960de55dcda/3fa556922b64473697f8960ca2f25218.png">
</picture> </div>
<a href="/media/code/story-yana-orlovceva/" class="news-block__title" style="font-family: 'Graphik'; font-size: 14px; line-height: 19px; -webkit-line-clamp: 4; font-weight: 500">
От пользователя до программиста 1С: история Яны Орловцевой </a>
</div>
</div>
<div class="slider-news__slide swiper-slide swiper-slide-active" style="margin-right: 20px;">
<div class="news-block__item">
<div class="news-block__img" style="margin-bottom: 8px;">
<picture>
<img src="https://248006.selcdn.ru/main/iblock/010/010725bb6a24b5d14ec80639eeb09031/ad6eb5f9c899b436ac21af1e7099be54.png">
</picture> </div>
<a href="/media/code/eslint-i-prettier/" class="news-block__title" style="font-family: 'Graphik'; font-size: 14px; line-height: 19px; -webkit-line-clamp: 4; font-weight: 500">
Гайд по ESLint и Prettier: от установки до автоматизации в VS Code </a>
</div>
</div>
</div>
<span class="swiper-notification" aria-live="assertive" aria-atomic="true"></span>
</div>
</div>
</div>
</div>
</div>
<div class="question">
<div class="container">
<div class="question__inner">
<div class="question__title">Понравилась статья?</div>
<a href="#" data-cur-url="/media/code/osnovnye-patterny-proektirovaniya-na-java/"
class="question__btn js-modalLink" data-mfp-src="#modalAuth">Да</a>
</div>
</div>
</div>
</div>
<span
data-area="article-bottom"
data-current-url="/media/code/osnovnye-patterny-proektirovaniya-na-java/"
data-id="222898">
</span>
</div>
<script type="application/ld+json">
{"@context":"http:\/\/schema.org","@type":"Article","url":"https:\/\/skillbox.ru\/media\/code\/osnovnye-patterny-proektirovaniya-na-java\/","headline":"\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u00a0Java","articleSection":"\u041a\u043e\u0434","articleBody":"\u0415\u0441\u0442\u044c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u0444\u0440\u0430\u0437\u0430: \u00ab\u0417\u0430\u0447\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \r\n\u0442\u043e, \u0447\u0442\u043e \u0443\u0436\u0435 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u043e?\u00bb \u041e\u043d\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0431\u044b\u0442\u0443, \u043d\u043e \u0438 \u0432 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u043e\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u0437\u0434\u0430\u043d\u0438\u044f. \u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. \u042d\u0442\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u043c\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0438 \u043e \u043d\u0438\u0445 \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435.\r\n\r\n\u041c\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f \u0441 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0435\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432, \r\n\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Java. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0435\u043c\u0430 \u0441\u043b\u043e\u0436\u043d\u0430\u044f, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0438 \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0435\u0442\u0430\u043b\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u0421\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u044d\u0442\u043e \u0432\u0432\u043e\u0434\u043d\u044b\u043c \u0433\u0430\u0439\u0434\u043e\u043c.\r\n\r\n\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\r\n\r\n- \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b [ #stk-1 ] \r\n- \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f [ #stk-2 ]\r\n \r\n- \u041f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \r\n[ #stk-3 ] \r\n\r\n- \u00ab\u0424\u0430\u0431\u0440\u0438\u043a\u0430\u00bb (Factory) [ #stk-4 ] \r\n- \u00ab\u0421\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u00bb (Builder) [ #stk-5 ] \r\n- \u00ab\u041e\u0434\u0438\u043d\u043e\u0447\u043a\u0430\u00bb (Singleton) [ #stk-6 ] \r\n\r\n- \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \r\n[ #stk-7 ] \r\n\r\n- \u00ab\u0410\u0434\u0430\u043f\u0442\u0435\u0440\u00bb (Adapter) [ #stk-8 ] \r\n- \u00ab\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u00bb (Decorator) [ #stk-9 ] \r\n- \u00ab\u0424\u0430\u0441\u0430\u0434\u00bb (Facade) [ #stk-10 ] \r\n\r\n- \u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \r\n[ #stk-11 ] \r\n\r\n- \u00ab\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f\u00bb (Strategy) [ #stk-12 ] \r\n- \u00ab\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c\u00bb (Observer) [ #stk-13 ] \r\n- \u00ab\u041f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044c\u00bb (Visitor) [ #stk-14 ] \r\n\r\n- \u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435 [ #stk-15 ] \r\n----------------------\r\n\r\n\r\n\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b\r\n\r\n\u041b\u044e\u0431\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \r\n\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430 \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0442\u043e\u0432\u0430\u0440\u043e\u0432 \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0435\u0439, \u043a\u043e\u0440\u0437\u0438\u043d\u0443 \u043f\u043e\u043a\u0443\u043f\u043e\u043a, \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043f\u043b\u0430\u0442\u0435\u0436\u0435\u0439 \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0437\u0430\u043a\u0430\u0437\u043e\u0432. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u044d\u0442\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0441 \u043d\u0443\u043b\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0445\u043e\u0442\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438.\r\n\r\n\u041f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0435, \r\n\u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c\u00bb \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0437\u0430\u043a\u0430\u0437\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043f\u043e\u043a\u0443\u043f\u0430\u0442\u0435\u043b\u044f, \u0430 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f\u00bb \u2014 \u0437\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043e\u043f\u043b\u0430\u0442\u044b: \u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u043e\u0439 \u043a\u0430\u0440\u0442\u043e\u0439, \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u043c \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u043e\u043c \u0438\u043b\u0438 \u043d\u0430\u043b\u0438\u0447\u043d\u044b\u043c\u0438.\r\n\r\n\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u2014 \r\n\u044d\u0442\u043e \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438, \u0430 \u043e\u0431\u0449\u0430\u044f \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0422\u0430\u043a, \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c\u00bb \u0432 \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432: \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 JavaScript, \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c WebSocket \u0438\u043b\u0438 \u043f\u0443\u0442\u0451\u043c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c GraphQL .\r\n\r\n\u041f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439. \r\n\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0438 \u0437\u0430\u043a\u0430\u0437\u0430 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432: \u00ab\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f\u00bb \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u043f\u043b\u0430\u0442\u044b, \u00ab\u0424\u0430\u0431\u0440\u0438\u043a\u0430\u00bb \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0437\u0430\u043a\u0430\u0437\u0430 \u0438 \u00ab\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u00bb \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0438\u043b\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u043b\u0443\u0433.\r\n\r\n\u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043d\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \r\n\u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438. \u0418\u0445 \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u2014 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u0434 \u0431\u043e\u043b\u0435\u0435 \u0433\u0438\u0431\u043a\u0438\u043c \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u043c \u0432 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435. \u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u043c\u0443 \u044d\u0444\u0444\u0435\u043a\u0442\u0443. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c\u0438 if-else, \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0446\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u043c \u00ab\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f\u00bb \u2014 \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0439 \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439.\r\n \r\n\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430\r\n\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435: Mermaid Chart \r\n\/ Skillbox Media\r\n\r\n\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\r\n\r\n\u0412\u0441\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \r\n\u043d\u0430 \u0442\u0440\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438: \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0435, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u0435. \u041f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u2014 \u0437\u0430 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0430 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u0435 \u2014 \u0437\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438.\r\n\r\n\u041f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u2014 \u044d\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \r\n\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u044e\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435. \u041e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043a\u0430\u043a \u0444\u0430\u0431\u0440\u0438\u043a\u0438: \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441-\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0437\u0430 \u043d\u0435\u0433\u043e.\r\n\r\n\u041a \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u043c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u043c \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f:\r\n\r\n- \u00ab\u0424\u0430\u0431\u0440\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434\u00bb (Factory Method) \r\n;\r\n- \u00ab\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0430\u00bb (Abstract Factory) \r\n;\r\n- \u00ab\u0421\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u00bb (Builder) \r\n;\r\n- \u00ab\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u00bb (Prototype) \r\n;\r\n- \u00ab\u041e\u0434\u0438\u043d\u043e\u0447\u043a\u0430\u00bb (Singleton) \r\n.\r\n\r\n\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u0432: \r\n\u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u043d\u0441\u043a\u0438\u0435 \u043f\u043b\u0430\u0442\u044b, \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u2014 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b, \u043d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u2014 \u0431\u043b\u043e\u043a\u0438 \u043f\u0438\u0442\u0430\u043d\u0438\u044f. \u041a\u0430\u0436\u0434\u0430\u044f \u043b\u0438\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0435\u0433\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u0422\u0430\u043a \u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u0424\u0430\u0431\u0440\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434\u00bb, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u0432\u043e\u0439 \u0442\u0438\u043f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0434\u043d\u0430 \u0444\u0430\u0431\u0440\u0438\u043a\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u0434\u0440\u0443\u0433\u0430\u044f \u2014 \u0437\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0430 \u0442\u0440\u0435\u0442\u044c\u044f \u2014 \u0437\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0438 \u0444\u0430\u0431\u0440\u0438\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442.\r\n\r\n\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \r\n\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u043a\u0440\u0443\u043f\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u041e\u043d\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u044e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041a\u0430\u043a \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 LEGO, \u0433\u0434\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0434\u0435\u0442\u0430\u043b\u0435\u0439, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432.\r\n\r\n\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0435\u043c\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432:\r\n\r\n- \u00ab\u0410\u0434\u0430\u043f\u0442\u0435\u0440\u00bb (Adapter) \r\n;\r\n- \u00ab\u041c\u043e\u0441\u0442\u00bb (Bridge) \r\n;\r\n- \u00ab\u041a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0449\u0438\u043a\u00bb (Composite) \r\n;\r\n- \u00ab\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u00bb (Decorator) \r\n;\r\n- \u00ab\u0424\u0430\u0441\u0430\u0434\u00bb (Facade) \r\n;\r\n- \u00ab\u041f\u0440\u0438\u0441\u043f\u043e\u0441\u043e\u0431\u043b\u0435\u043d\u0435\u0446\u00bb (Flyweight) \r\n;\r\n- \u00ab\u0417\u0430\u043c\u0435\u0441\u0442\u0438\u0442\u0435\u043b\u044c\u00bb (Proxy) \r\n.\r\n\r\n\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u0430\u044f \u0432\u0438\u043b\u043a\u0430 \r\n\u0438 \u0430\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0430\u044f \u0440\u043e\u0437\u0435\u0442\u043a\u0430. \u0411\u0435\u0437 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043d\u0438\u043a\u0430 \u0438\u0445 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u0437-\u0437\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432. \u0422\u0430\u043a\u0430\u044f \u0436\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u0410\u0434\u0430\u043f\u0442\u0435\u0440\u00bb: \u043e\u043d \u0434\u0435\u043b\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u043c\u0438 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u0445 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435.\r\n\r\n\u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u044e \r\n\u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041e\u043d\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043e\u0431\u043c\u0435\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044f\u0437\u0430\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u0441\u043b\u0430\u0431\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u043e\u0433\u043b\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c.\r\n\r\n\u041a \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u043c \r\n\u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f:\r\n\r\n- \u00ab\u041a\u043e\u043c\u0430\u043d\u0434\u0430\u00bb (Command) \r\n;\r\n- \u00ab\u0418\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u00bb (Iterator) \r\n;\r\n- \u00ab\u041f\u043e\u0441\u0440\u0435\u0434\u043d\u0438\u043a\u00bb (Mediator) \r\n;\r\n- \u00ab\u0425\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u044c\u00bb (Memento) \r\n;\r\n- \u00ab\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c\u00bb (Observer) \r\n;\r\n- \u00ab\u0426\u0435\u043f\u043e\u0447\u043a\u0430 \u043e\u0431\u044f\u0437\u0430\u043d\u043d\u043e\u0441\u0442\u0435\u0439\u00bb (Chain of responsibility) \r\n ;\r\n- \u00ab\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u00bb (State) \r\n;\r\n- \u00ab\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f\u00bb (Strategy) \r\n;\r\n- \u00ab\u0428\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434\u00bb (Template method) \r\n;\r\n- \u00ab\u041f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044c\u00bb (Visitor) \r\n.\r\n\r\n\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0441\u0432\u0435\u0442\u043e\u0444\u043e\u0440\u043e\u0432 \u0432 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \r\n\u0433\u043e\u0440\u043e\u0434\u0435. \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0432\u0435\u0442\u043e\u0444\u043e\u0440 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435\u043c \u043d\u0430 \u0441\u0432\u043e\u0451\u043c \u043f\u0435\u0440\u0435\u043a\u0440\u0451\u0441\u0442\u043a\u0435 (\u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u044b), \u0430 \u0432\u0441\u0435 \u0441\u0432\u0435\u0442\u043e\u0444\u043e\u0440\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0435\u0434\u0438\u043d\u044b\u0439 \u0446\u0435\u043d\u0442\u0440 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f (\u00ab\u041f\u043e\u0441\u0440\u0435\u0434\u043d\u0438\u043a\u00bb). \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0430\u0432\u0430\u0440\u0438\u0438 \u0438\u043b\u0438 \u043f\u0440\u043e\u0431\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0441\u0435\u0445 \u0441\u0432\u0435\u0442\u043e\u0444\u043e\u0440\u043e\u0432 (\u00ab\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c\u00bb), \u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u0443\u044e\u0442 \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u043d\u0430 \u0434\u043e\u0440\u043e\u0433\u0435 (\u00ab\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f\u00bb).\r\n\r\n\r\n\r\n\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u0445 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \r\n\u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0438\u0437 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445. \u041a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u2014 \u0431\u0435\u0437 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445. \u042d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043d\u044f\u0442\u044c \u0441\u0443\u0442\u044c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0438\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0432\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c Java \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0440\u0435\u0434\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0434 \u0441\u0432\u043e\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443.\r\n\r\n\r\n\r\n \r\n\r\n\r\n\u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u0442\u0430\u043a\u0436\u0435:\r\n\r\n\u041a\u0430\u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c JDK \u0438 \u0441\u0440\u0435\u0434\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \r\nIntelliJ IDEA [ https:\/\/skillbox.ru\/media\/base\/kak_ustanovit_jdk_i_sredu_razrabotki_intellij_idea\/?utm_source=media&utm_medium=link&utm_campaign=all_all_media_links_links_articles_all_all_skillbox ] \r\n\r\n\u041f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\r\n\r\n\u0412 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \r\n\u0442\u0440\u0438 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u0430: \u00ab\u0424\u0430\u0431\u0440\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434\u00bb, \u00ab\u0421\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u00bb \u0438 \u00ab\u041e\u0434\u0438\u043d\u043e\u0447\u043a\u0430\u00bb. \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0438\u0445 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.\u00ab\u0424\u0430\u0431\u0440\u0438\u043a\u0430\u00bb (Factory)\r\n\r\n\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u0424\u0430\u0431\u0440\u0438\u043a\u0430\u00bb (\u0438\u043b\u0438 \u00ab\u0424\u0430\u0431\u0440\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434\u00bb) \u2014 \r\n\u044d\u0442\u043e \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441\u0443\u043f\u0435\u0440\u043a\u043b\u0430\u0441\u0441\u0430 \u0431\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0438\u0445 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430. \u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0438\u043b\u0438 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0436\u0451\u0441\u0442\u043a\u043e\u0439 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u0430\u043c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043e\u0434 \u0433\u0438\u0431\u043a\u0438\u043c \u0438 \u043b\u0435\u0433\u043a\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u044b\u043c. \u041f\u0430\u0442\u0442\u0435\u0440\u043d \u0442\u0430\u043a\u0436\u0435 \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u0434\u0435\u0442\u0430\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0447\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043a\u043e\u0434\u043e\u043c \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u043c.\r\n\r\n\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u00ab\u0424\u0430\u0431\u0440\u0438\u043a\u0430\u00bb \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \r\n\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043b\u044f \u043f\u0438\u0446\u0446\u0435\u0440\u0438\u0438. \u041c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0431\u0440\u0438\u043a\u0443 \u0441 \u0435\u0434\u0438\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0442\u0440\u0438 \u0432\u0438\u0434\u0430 \u043f\u0438\u0446\u0446\u044b: \u00ab\u0427\u0435\u0442\u044b\u0440\u0435 \u0441\u044b\u0440\u0430\u00bb, \u00ab\u041f\u0435\u043f\u043f\u0435\u0440\u043e\u043d\u0438\u00bb \u0438 \u00ab\u041c\u0430\u0440\u0433\u0430\u0440\u0438\u0442\u0443\u00bb. \u0417\u0430\u0442\u0435\u043c \u043f\u0440\u0438 \u0437\u0430\u043a\u0430\u0437\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0430 \u043f\u0438\u0446\u0446\u044b \u0444\u0430\u0431\u0440\u0438\u043a\u0430 \u0432\u0435\u0440\u043d\u0451\u0442 \u043d\u0430\u043c \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442.\r\n\r\npublic class MainFactory { public static void main(String[] args) { \/\/ \r\n\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0444\u0430\u0431\u0440\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0438\u0446\u0446\u0443 PizzaFactory pizzaFactory = new PizzaFactory(); try { \/\/ \u0417\u0430\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0438\u0446\u0446\u0443 \u00ab\u0427\u0435\u0442\u044b\u0440\u0435 \u0441\u044b\u0440\u0430\u00bb \u0443 \u0444\u0430\u0431\u0440\u0438\u043a\u0438 Pizza pizza = pizzaFactory.createPizza(\"\u0427\u0435\u0442\u044b\u0440\u0435 \u0441\u044b\u0440\u0430\"); \/\/ \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0438\u0446\u0446\u044b pizza.doPizza(); } catch (IllegalArgumentException e) { \/\/ \u0415\u0441\u043b\u0438 \u043f\u0438\u0446\u0446\u044b \u043d\u0435\u0442 \u0432 \u043c\u0435\u043d\u044e, \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 System.out.println(\"\u041e\u0448\u0438\u0431\u043a\u0430: \" + e.getMessage()); } } } \/\/ \u0424\u0430\u0431\u0440\u0438\u043a\u0430 \u2014 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u0438\u0446\u0446 class PizzaFactory { \/\/ \u041c\u0435\u0442\u043e\u0434 createPizza \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0438\u0446\u0446\u044b \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 public Pizza createPizza(String type) { \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0438\u0446\u0446\u044b \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 switch(type.toLowerCase()) { case \"\u0427\u0435\u0442\u044b\u0440\u0435 \u0441\u044b\u0440\u0430\": return new FourCheesePizza(); case \"\u041f\u0435\u043f\u043f\u0435\u0440\u043e\u043d\u0438\": return new PepperoniPizza(); case \"\u041c\u0430\u0440\u0433\u0430\u0440\u0438\u0442\u0430\": return new MargaritaPizza(); default: throw new IllegalArgumentException(\"\u0422\u0430\u043a\u043e\u0439 \u043f\u0438\u0446\u0446\u044b \u043d\u0435\u0442 \u0432 \u043c\u0435\u043d\u044e: \" + type); } } } \/\/ \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0432\u0438\u0434\u043e\u0432 \u043f\u0438\u0446\u0446 abstract class Pizza { public abstract void doPizza(); } \/\/ \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u043f\u0438\u0446\u0446 class FourCheesePizza extends Pizza { @Override public void doPizza() { System.out.println(\"\u0413\u043e\u0442\u043e\u0432\u0438\u043c \u043e\u0441\u043e\u0431\u0443\u044e \u043f\u0438\u0446\u0446\u0443 \u00ab\u0427\u0435\u0442\u044b\u0440\u0435 \u0441\u044b\u0440\u0430\u00bb \u0441 \u043c\u043e\u0446\u0430\u0440\u0435\u043b\u043b\u043e\u0439, \u043f\u0430\u0440\u043c\u0435\u0437\u0430\u043d\u043e\u043c, \u0433\u043e\u0440\u0433\u043e\u043d\u0437\u043e\u043b\u043e\u0439 \u0438 \u0447\u0435\u0434\u0434\u0435\u0440\u043e\u043c!\"); } } class PepperoniPizza extends Pizza { @Override public void doPizza() { System.out.println(\"\u0413\u043e\u0442\u043e\u0432\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u0438\u0446\u0446\u0443 \u00ab\u041f\u0435\u043f\u043f\u0435\u0440\u043e\u043d\u0438\u00bb \u0441 \u043e\u0441\u0442\u0440\u044b\u043c\u0438 \u043a\u043e\u043b\u0431\u0430\u0441\u043a\u0430\u043c\u0438!\"); } } class MargaritaPizza extends Pizza { @Override public void doPizza() { System.out.println(\"\u0413\u043e\u0442\u043e\u0432\u0438\u043c \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u043f\u0438\u0446\u0446\u0443 \u00ab\u041c\u0430\u0440\u0433\u0430\u0440\u0438\u0442\u0430\u00bb \u0441 \u0442\u043e\u043c\u0430\u0442\u0430\u043c\u0438 \u0438 \u0431\u0430\u0437\u0438\u043b\u0438\u043a\u043e\u043c!\"); } } \/\/ \u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434, \u0444\u0430\u0431\u0440\u0438\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043f\u0438\u0446\u0446\u0443 \u00ab\u0427\u0435\u0442\u044b\u0440\u0435 \u0441\u044b\u0440\u0430\u00bb\u00ab\u0421\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u00bb (Builder)\r\n\r\n\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u0421\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u00bb \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u044b\u0439 \r\n\u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0415\u0433\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 \u0435\u0434\u0438\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043a\u043e\u0434 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0447\u0438\u0441\u0442\u044b\u043c, \u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.\r\n\r\n\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u0443\u044e \r\n\u0441\u0431\u043e\u0440\u043a\u0443 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u0441 \u0442\u0440\u0435\u043c\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438: \u043c\u043e\u0449\u043d\u044b\u043c \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c (CPU), \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u043e\u0439 (GPU) \u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e (memory).\r\n\r\npublic class MainBuilder { public static void main(String[] args) { \/\/ \r\n\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 ComputerBuilder builder = new GamingPCBuilder(); \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \u0441\u0431\u043e\u0440\u043a\u0438 PCDirector director = new PCDirector(builder); director.constructGamingPC(); \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 Computer gamingPC = builder.getPC(); \/\/ \u0412\u044b\u0432\u043e\u0434\u0438\u043c \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 System.out.println(gamingPC); } } \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043b\u0430\u0441\u0441 Computer \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 class Computer { private String CPU; \/\/ \u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 private String GPU; \/\/ \u0412\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 private int memory; \/\/ \u041e\u0431\u044a\u0451\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 (\u0413\u0411) public Computer(String CPU, String GPU, int memory) { this.CPU = CPU; this.GPU = GPU; this.memory = memory; } @Override public String toString() { return \"\u041a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440: \" + CPU + \", \" + GPU + \", \" + memory + \" \u0413\u0411\"; } } \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u00ab\u0421\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u0432\u00bb \u0434\u043b\u044f \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 interface ComputerBuilder { void setCPU(String CPU); void setGPU(String GPU); void setMemory(int memory); Computer getPC(); \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043b\u0430\u0441\u0441 \u00ab\u0418\u0433\u0440\u043e\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u00bb \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u0432 \u0441 \u043c\u043e\u0449\u043d\u044b\u043c\u0438 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430\u043c\u0438 class GamingPCBuilder implements ComputerBuilder { private String CPU; private String GPU; private int memory; @Override public void setCPU(String CPU) { this.CPU = CPU; } @Override public void setGPU(String GPU) { this.GPU = GPU; } @Override public void setMemory(int memory) { this.memory = memory; } @Override public Computer getPC() { return new Computer(CPU, GPU, memory); } } \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043b\u0430\u0441\u0441 \u00ab\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u00bb \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \u0441\u0431\u043e\u0440\u043a\u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 class PCDirector { private ComputerBuilder builder; public PCDirector(ComputerBuilder builder) { this.builder = builder; } \/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430\u043c\u0438 public void constructGamingPC() { builder.setCPU(\"Intel Core i9-13900K\"); \/\/ \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043c\u043e\u0449\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 builder.setGPU(\"NVIDIA GeForce RTX 4090\"); \/\/ \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0442\u043e\u043f\u043e\u0432\u0443\u044e \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443 builder.setMemory(32); \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c 32 \u0413\u0411 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 } } \/\/ \u041a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440: Intel Core i9-13900K, NVIDIA GeForce RTX 4090, 32 \u0413\u0411\u00ab\u041e\u0434\u0438\u043d\u043e\u0447\u043a\u0430\u00bb (Singleton)\r\n\r\n\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u041e\u0434\u0438\u043d\u043e\u0447\u043a\u0430\u00bb \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \r\n\u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0435\u0434\u0438\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043d\u0435\u043c\u0443. \u042d\u0442\u043e \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043e\u0431\u0449\u0438\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0431\u044b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a, \u043e\u043d\u0438 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0442\u044c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443: \u043e\u0434\u0438\u043d \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b \u0431\u044b \u0441\u0432\u0435\u0442\u043b\u0443\u044e \u0442\u0435\u043c\u0443, \u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0442\u0451\u043c\u043d\u0443\u044e. \u041f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u041e\u0434\u0438\u043d\u043e\u0447\u043a\u0430\u00bb \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c.\r\n\r\n\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u0449\u0435\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \r\n\u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0441\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u043c.\r\n\r\npublic class MainSingleton { public static void main(String[] args) { \/\/ \r\n\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 getInstance() DBConnection db1 = DBConnection.getInstance(); \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c SQL-\u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 db1.executeQuery(db1.hashCode() + \": CREATE DATABASE Users\"); \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 DBConnection db2 = DBConnection.getInstance(); \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c SQL-\u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0431\u0430\u0437\u044b db2.executeQuery(db2.hashCode() + \": SELECT * FROM Users\"); \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043e\u0431\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 System.out.println(db1 == db2); \/\/ true } } \/\/ \u041a\u043b\u0430\u0441\u0441 \u00ab\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d Singleton class DBConnection { private static DBConnection instance; \/\/ \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \/\/ \u041f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u0437\u0432\u043d\u0435 private DBConnection() { System.out.println(\"Singleton \u0441\u043e\u0437\u0434\u0430\u043d. \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0411\u0414 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e.\"); } \/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 public static synchronized DBConnection getInstance() { if (instance == null) { \/\/ \u0415\u0441\u043b\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0435\u0449\u0451 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043d, \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0435\u0433\u043e instance = new DBConnection(); } return instance; \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 } \/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 public synchronized void executeQuery(String query) { System.out.println(\"\u0417\u0430\u043f\u0440\u043e\u0441: \" + query); } }\r\n\r\n\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043e\u0434\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \r\ntrue. \u042d\u0442\u043e \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u041e\u0434\u0438\u043d\u043e\u0447\u043a\u0430\u00bb \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u2014 \u043e\u0431\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 db1 \u0438 db2 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u044b\u0432\u043e\u0434 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438:\r\n\r\nSingleton \u0441\u043e\u0437\u0434\u0430\u043d. \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0411\u0414 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e. \r\n\/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c SQL-\u0437\u0430\u043f\u0440\u043e\u0441 \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u044a\u0435\u043a\u0442 db1 (\u0433\u0434\u0435 1392838282 \u2014 \u0445\u0435\u0448-\u043a\u043e\u0434 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b) \u0417\u0430\u043f\u0440\u043e\u0441: 1392838282: CREATE DATABASE Users \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c SQL-\u0437\u0430\u043f\u0440\u043e\u0441 \u0447\u0435\u0440\u0435\u0437 \u0442\u043e\u0442 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 db2 (\u0445\u0435\u0448-\u043a\u043e\u0434\u044b \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442) \u0417\u0430\u043f\u0440\u043e\u0441: 1392838282: SELECT * FROM Users \/\/ \u041f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u041e\u0434\u0438\u043d\u043e\u0447\u043a\u0430\u00bb \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e true \r\n\r\n\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\r\n\r\n\u0412 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0440\u0438 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \r\n\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438: \u00ab\u0410\u0434\u0430\u043f\u0442\u0435\u0440\u00bb, \u00ab\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u00bb \u0438 \u00ab\u0424\u0430\u0441\u0430\u0434\u00bb.\u00ab\u0410\u0434\u0430\u043f\u0442\u0435\u0440\u00bb (Adapter)\r\n\r\n\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u0410\u0434\u0430\u043f\u0442\u0435\u0440\u00bb \u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \r\n\u0448\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u044b \u0441 \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c\u0438 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.\r\n\r\n\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e: \u0443 \u0432\u0430\u0441 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d \r\n\u0441 \u0440\u0430\u0437\u044a\u0451\u043c\u043e\u043c Type-C, \u0430 \u043d\u0430\u0443\u0448\u043d\u0438\u043a\u0438 \u2014 \u0441 \u0440\u0430\u0437\u044a\u0451\u043c\u043e\u043c 3.5 \u043c\u043c (Jack). \u0411\u0435\u0437 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043d\u0438\u043a\u0430 \u0438\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0434\u0430 \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b.\r\n\r\n\/\/ \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0441 \u0440\u0430\u0437\u044a\u0451\u043c\u043e\u043c 3,5 \r\n\u043c\u043c (Jack) interface HeadphoneJack { void plugIn(); \/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 \u0440\u0430\u0437\u044a\u0451\u043c\u043e\u043c 3,5 \u043c\u043c } \/\/ \u041a\u043b\u0430\u0441\u0441 \u043d\u0430\u0443\u0448\u043d\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0440\u0430\u0437\u044a\u0451\u043c\u0430 Jack class Headphones implements HeadphoneJack { @Override public void plugIn() { \/\/ \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043d\u0430\u0443\u0448\u043d\u0438\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0437\u044a\u0451\u043c Jack System.out.println(\"\u041d\u0430\u0443\u0448\u043d\u0438\u043a\u0438 \u0441 \u0440\u0430\u0437\u044a\u0451\u043c\u043e\u043c Jack \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b!\"); } } \/\/ \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0441 \u0440\u0430\u0437\u044a\u0451\u043c\u043e\u043c Type-C interface TypeCDevice { void connect(); \/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0437\u044a\u0451\u043c Type-C } \/\/ \u041a\u043b\u0430\u0441\u0441-\u0430\u0434\u0430\u043f\u0442\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 \u0440\u0430\u0437\u044a\u0451\u043c\u043e\u043c Jack \u0447\u0435\u0440\u0435\u0437 Type-C class HeadphoneAdapter implements TypeCDevice { private HeadphoneJack headphoneJack; \/\/ \u041e\u0431\u044a\u0435\u043a\u0442 \u0441 \u0440\u0430\u0437\u044a\u0451\u043c\u043e\u043c Jack, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0430\u0434\u0430\u043f\u0442\u0435\u0440 \/\/ \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441 \u0440\u0430\u0437\u044a\u0451\u043c\u043e\u043c Jack public HeadphoneAdapter(HeadphoneJack headphoneJack) { this.headphoneJack = headphoneJack; \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e } @Override public void connect() { \/\/ \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043d\u0430\u0443\u0448\u043d\u0438\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0437\u044a\u0451\u043c Jack, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Type-C headphoneJack.plugIn(); } } \/\/ \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 public class MainAdapter { public static void main(String[] args) { \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430\u0443\u0448\u043d\u0438\u043a\u043e\u0432 \u0441 \u0440\u0430\u0437\u044a\u0451\u043c\u043e\u043c 3,5 \u043c\u043c HeadphoneJack headphones = new Headphones(); \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0430\u0434\u0430\u043f\u0442\u0435\u0440 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0443\u0448\u043d\u0438\u043a\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0437\u044a\u0451\u043c Type-C TypeCDevice adapter = new HeadphoneAdapter(headphones); \/\/ \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043d\u0430\u0443\u0448\u043d\u0438\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u0430\u0434\u0430\u043f\u0442\u0435\u0440 (\u0440\u0430\u0437\u044a\u0451\u043c Type-C) adapter.connect(); } } \/\/ \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u043d\u0430\u0443\u0448\u043d\u0438\u043a\u0438 \u0441 \u0440\u0430\u0437\u044a\u0451\u043c\u043e\u043c Jack \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b!\u00ab\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u00bb (Decorator)\r\n\r\n\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u00bb \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \r\n\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0435\u0431\u0435 \u043f\u043e\u0434\u0430\u0440\u043e\u043a: \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0432 \u043f\u0440\u0430\u0437\u0434\u043d\u0438\u0447\u043d\u0443\u044e \u0431\u0443\u043c\u0430\u0433\u0443, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043b\u0435\u043d\u0442\u0443, \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u043a\u0443 \u2014 \u0438 \u0432\u0441\u0451 \u044d\u0442\u043e, \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u044f \u0441\u0430\u043c \u043f\u043e\u0434\u0430\u0440\u043e\u043a. \u0412 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0432\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0435\u00bb \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u0442\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u044b \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442.\r\n\r\n\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u0432\u044b \u043a\u0430\u0436\u0434\u043e\u0435 \u0443\u0442\u0440\u043e \u0437\u0430\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0435 \r\n\u043a\u043e\u0444\u0435 \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u0432\u043a\u0443\u0441\u0443. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0447\u0451\u0440\u043d\u044b\u0439 \u043a\u043e\u0444\u0435, \u0437\u0430\u0432\u0442\u0440\u0430 \u2014 \u043a\u043e\u0444\u0435 \u0441 \u043c\u043e\u043b\u043e\u043a\u043e\u043c \u0431\u0435\u0437 \u0441\u0430\u0445\u0430\u0440\u0430, \u0430 \u043f\u043e\u0441\u043b\u0435\u0437\u0430\u0432\u0442\u0440\u0430 \u2014 \u0441 \u0441\u0430\u0445\u0430\u0440\u043e\u043c. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c.\r\n\r\npublic class MainDecorator { public static void main(String[] args) { \/\/ \r\n\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0447\u0451\u0440\u043d\u044b\u0439 \u043a\u043e\u0444\u0435 \u0431\u0435\u0437 \u0434\u043e\u0431\u0430\u0432\u043e\u043a Coffee coffee = new BlackCoffee(); \/\/ \u0412\u044b\u0432\u043e\u0434\u0438\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0447\u0451\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0444\u0435 System.out.println(coffee.getDescription()); \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u043e\u043b\u043e\u043a\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u0430 coffee = new MilkDecorator(coffee); \/\/ \u0412\u044b\u0432\u043e\u0434\u0438\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u0444\u0435 \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043c\u043e\u043b\u043e\u043a\u0430 System.out.println(coffee.getDescription()); \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0430\u0445\u0430\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u0430 coffee = new SugarDecorator(coffee); \/\/ \u0412\u044b\u0432\u043e\u0434\u0438\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u0444\u0435 \u0441 \u043c\u043e\u043b\u043e\u043a\u043e\u043c \u0438 \u0441\u0430\u0445\u0430\u0440\u043e\u043c System.out.println(coffee.getDescription()); } } \/\/ \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u043a\u043e\u0444\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043d\u0430\u043f\u0438\u0442\u043a\u0430 interface Coffee { String getDescription(); } \/\/ \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0447\u0451\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0444\u0435 \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 Coffee class BlackCoffee implements Coffee { @Override public String getDescription() { return \"\u0427\u0451\u0440\u043d\u044b\u0439 \u043a\u043e\u0444\u0435\"; \/\/ \u041f\u0440\u043e\u0441\u0442\u043e \u0447\u0451\u0440\u043d\u044b\u0439 \u043a\u043e\u0444\u0435 \u0431\u0435\u0437 \u0434\u043e\u0431\u0430\u0432\u043e\u043a } } \/\/ \u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441-\u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 Coffee abstract class CoffeeDecorator implements Coffee { protected Coffee coffee; \/\/ \u0421\u0441\u044b\u043b\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 Coffee, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u043c \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \/\/ \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 Coffee public CoffeeDecorator(Coffee coffee) { this.coffee = coffee; } \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u0444\u0435 \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430\u043c\u0438 public String getDescription() { return coffee.getDescription(); } } \/\/ \u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u043b\u043e\u043a\u0430 \u0432 \u043a\u043e\u0444\u0435 class MilkDecorator extends CoffeeDecorator { public MilkDecorator(Coffee coffee) { super(coffee); \/\/ \u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043a\u043e\u0444\u0435 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 } @Override public String getDescription() { return coffee.getDescription() + \", \u043c\u043e\u043b\u043e\u043a\u043e\"; \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u043e\u043b\u043e\u043a\u043e \u043a \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e } } \/\/ \u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0430\u0445\u0430\u0440\u0430 \u0432 \u043a\u043e\u0444\u0435 class SugarDecorator extends CoffeeDecorator { public SugarDecorator(Coffee coffee) { super(coffee); \/\/ \u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043a\u043e\u0444\u0435 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 } @Override public String getDescription() { return coffee.getDescription() + \", \u0441\u0430\u0445\u0430\u0440\"; \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0430\u0445\u0430\u0440 \u043a \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e } }\r\n\r\n\u0415\u0441\u043b\u0438 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043a\u043e\u0434, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \r\n\u0432\u044b\u0432\u043e\u0434:\r\n\r\n\u0427\u0451\u0440\u043d\u044b\u0439 \u043a\u043e\u0444\u0435 \u0427\u0451\u0440\u043d\u044b\u0439 \u043a\u043e\u0444\u0435, \u043c\u043e\u043b\u043e\u043a\u043e \u0427\u0451\u0440\u043d\u044b\u0439 \r\n\u043a\u043e\u0444\u0435, \u043c\u043e\u043b\u043e\u043a\u043e, \u0441\u0430\u0445\u0430\u0440\r\n\r\n\u041c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 BlackCoffee (\u0431\u0430\u0437\u043e\u0432\u044b\u0439 \r\n\u0447\u0451\u0440\u043d\u044b\u0439 \u043a\u043e\u0444\u0435), \u0430 \u0437\u0430\u0442\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043a \u043d\u0435\u043c\u0443 \u043c\u043e\u043b\u043e\u043a\u043e \u0438 \u0441\u0430\u0445\u0430\u0440. \u041a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a \u0435\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0433\u0440\u0435\u0434\u0438\u0435\u043d\u0442. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0433\u0438\u0431\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u0434\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043d\u0430\u0448 \u043a\u043e\u0444\u0435 \u043a\u043e\u0440\u0438\u0446\u0443, \u0441\u043b\u0438\u0432\u043a\u0438 \u0438\u043b\u0438 \u0441\u0438\u0440\u043e\u043f.\r\n\r\n\r\n\r\n \r\n\r\n\r\n\u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u0442\u0430\u043a\u0436\u0435:\r\n\r\n\u0428\u0430\u0431\u043b\u043e\u043d \u00ab\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u00bb: \u0441\u0443\u043f\u0435\u0440\u0441\u0438\u043b\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432-\u043e\u0431\u0451\u0440\u0442\u043e\u043a \r\n \u00ab\u0424\u0430\u0441\u0430\u0434\u00bb (Facade)\r\n\r\n\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u0424\u0430\u0441\u0430\u0434\u00bb \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0434\u0438\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \r\n\u0432\u0445\u043e\u0434\u0430 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435 \u0432\u043d\u0438\u043a\u0430\u0442\u044c \u0432 \u0435\u0451 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. \u042d\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u043f\u0443\u043b\u044c\u0442 \u043e\u0442 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u043a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440\u0430, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043f\u0443\u043b\u044c\u0442.\r\n\r\n\/\/ \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0430\u0443\u0434\u0438\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 class \r\nAudioSystem { \/\/ \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0430\u0443\u0434\u0438\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0443 public void on() { System.out.println(\"\u0410\u0443\u0434\u0438\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 7.1 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430\"); } \/\/ \u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0430\u0443\u0434\u0438\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0443 public void off() { System.out.println(\"\u0410\u0443\u0434\u0438\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 7.1 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430\"); } } \/\/ \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u043e\u043c class Screen { \/\/ \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u044d\u043a\u0440\u0430\u043d public void on() { System.out.println(\"\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e\"); } \/\/ \u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u044d\u043a\u0440\u0430\u043d public void off() { System.out.println(\"\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e\"); } } \/\/ \u0424\u0430\u0441\u0430\u0434 \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u043a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440\u0430 class HomeTheaterFacade { private AudioSystem audioSystem; \/\/ \u041e\u0431\u044a\u0435\u043a\u0442 \u0430\u0443\u0434\u0438\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b private Screen screen; \/\/ \u041e\u0431\u044a\u0435\u043a\u0442 \u044d\u043a\u0440\u0430\u043d\u0430 \/\/ \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0430\u0443\u0434\u0438\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u044d\u043a\u0440\u0430\u043d\u0430 public HomeTheaterFacade(AudioSystem audioSystem, Screen screen) { this.audioSystem = audioSystem; this.screen = screen; } \/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440\u0430 public void start() { System.out.println(\"\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u043a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440\u0430:\"); screen.on(); \/\/ \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u044d\u043a\u0440\u0430\u043d audioSystem.on(); \/\/ \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0430\u0443\u0434\u0438\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0443 } \/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440\u0430 public void end() { System.out.println(\"\u0412\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u043a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440\u0430:\"); audioSystem.off(); \/\/ \u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0430\u0443\u0434\u0438\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0443 screen.off(); \/\/ \u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u044d\u043a\u0440\u0430\u043d } } \/\/ \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u0433\u0434\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 public class MainFacade { public static void main(String[] args) { \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u044d\u043a\u0440\u0430\u043d\u0430 \u0438 \u0430\u0443\u0434\u0438\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b Screen screen = new Screen(); AudioSystem audioSystem = new AudioSystem(); \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0444\u0430\u0441\u0430\u0434, \u0447\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u043a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440\u0430 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e HomeTheaterFacade homeTheater = new HomeTheaterFacade(audioSystem, screen); \/\/ \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440\u0430 homeTheater.start(); \/\/ \u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440\u0430 homeTheater.end(); } }\r\n\r\n\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043e\u0434\u0430 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u043a\u0442 \r\n\u0444\u0430\u0441\u0430\u0434\u0430 (HomeTheaterFacade) \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0441\u0435\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0435\u0434\u0438\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b:\r\n\r\n\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u043a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440\u0430: \r\n\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0410\u0443\u0434\u0438\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 7.1 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u0412\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0433\u043e \u043a\u0438\u043d\u043e\u0442\u0435\u0430\u0442\u0440\u0430: \u0410\u0443\u0434\u0438\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 7.1 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e\r\n\r\n\u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\r\n\r\n\u0412 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043c\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f \u0441 \u0442\u0440\u0435\u043c\u044f \r\n\u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438: \u00ab\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f\u00bb, \u00ab\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c\u00bb \u0438 \u00ab\u041f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044c\u00bb. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u0438 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435.\u00ab\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f\u00bb (Strategy)\r\n\r\n\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f\u00bb \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \r\n\u0432\u0437\u0430\u0438\u043c\u043e\u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0441\u0445\u043e\u0436\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430 \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u2014 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0439, \u043f\u0435\u0448\u0435\u0445\u043e\u0434\u043d\u044b\u0439 \u0438 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434\u043d\u044b\u0439. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043e\u0434 \u0447\u0438\u0449\u0435 \u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\r\n\r\n\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f\u00bb \r\n\u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u043b\u0430\u0442\u0451\u0436\u043d\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0441 \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438 \u043e\u043f\u043b\u0430\u0442\u044b: \u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u043e\u0439 \u043a\u0430\u0440\u0442\u043e\u0439 \u0438 \u043f\u043e QR-\u043a\u043e\u0434\u0443. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c.\r\n\r\npublic class MainStrategy { public static void main(String[] args) { ShoppingCart \r\ncart = new ShoppingCart(); \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043e\u0440\u0437\u0438\u043d\u0443 \u043f\u043e\u043a\u0443\u043f\u043e\u043a \/\/ \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u043f\u043b\u0430\u0442\u0443 \u043a\u0430\u0440\u0442\u043e\u0439 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u043b\u0430\u0442\u0451\u0436 cart.setPaymentStrategy(new CreditCardPayment(\"1234-5678-9012-3456\")); cart.checkout(150.00); \/\/ \u041c\u0435\u043d\u044f\u0435\u043c \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u043b\u0430\u0442\u044b \u043d\u0430 QR-\u043a\u043e\u0434 \u0438 \u0441\u043d\u043e\u0432\u0430 \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u043f\u043b\u0430\u0442\u0451\u0436 cart.setPaymentStrategy(new QRCodePayment(\"QR1234567890\")); cart.checkout(75.50); } } \/\/ \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043e\u043f\u043b\u0430\u0442\u044b interface PaymentStrategy { void pay(double amount); \/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u0442\u0435\u0436\u0430 } \/\/ \u041e\u043f\u043b\u0430\u0442\u0430 \u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u043e\u0439 \u043a\u0430\u0440\u0442\u043e\u0439 class CreditCardPayment implements PaymentStrategy { private String cardNumber; \/\/ \u041d\u043e\u043c\u0435\u0440 \u043a\u0430\u0440\u0442\u044b public CreditCardPayment(String cardNumber) { this.cardNumber = cardNumber; } @Override public void pay(double amount) { System.out.println(\"\u041e\u043f\u043b\u0430\u0447\u0435\u043d\u043e \u043a\u0430\u0440\u0442\u043e\u0439 \" + cardNumber + \" \u043d\u0430 \u0441\u0443\u043c\u043c\u0443: $\" + amount); } } \/\/ \u041e\u043f\u043b\u0430\u0442\u0430 \u043f\u043e QR-\u043a\u043e\u0434\u0443 class QRCodePayment implements PaymentStrategy { private String qrCode; \/\/ \u041a\u043e\u0434 \u0434\u043b\u044f \u043e\u043f\u043b\u0430\u0442\u044b public QRCodePayment(String qrCode) { this.qrCode = qrCode; } @Override public void pay(double amount) { System.out.println(\"\u041e\u043f\u043b\u0430\u0447\u0435\u043d\u043e \u043f\u043e QR-\u043a\u043e\u0434\u0443 \" + qrCode + \" \u043d\u0430 \u0441\u0443\u043c\u043c\u0443: $\" + amount); } } \/\/ \u041a\u043b\u0430\u0441\u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u044b \u043f\u043e\u043a\u0443\u043f\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043e\u043f\u043b\u0430\u0442\u044b class ShoppingCart { private PaymentStrategy paymentStrategy; \/\/ \u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u043b\u0430\u0442\u044b \/\/ \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u043e\u043f\u043b\u0430\u0442\u044b public void setPaymentStrategy(PaymentStrategy paymentStrategy) { this.paymentStrategy = paymentStrategy; } \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u043f\u043b\u0430\u0442\u0443 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c public void checkout(double amount) { if (paymentStrategy == null) { System.out.println(\"\u041e\u0448\u0438\u0431\u043a\u0430: \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u043b\u0430\u0442\u044b!\"); return; } paymentStrategy.pay(amount); } }\r\n\r\n\u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \r\n\u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u0442\u0435\u0436\u0438 \u043e\u0431\u043e\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 \u0435\u0434\u0438\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 PaymentStrategy:\r\n\r\n\u041e\u043f\u043b\u0430\u0447\u0435\u043d\u043e \u043a\u0430\u0440\u0442\u043e\u0439 1234-5678-9012-3456 \u043d\u0430 \u0441\u0443\u043c\u043c\u0443: $150.0 \r\n\u041e\u043f\u043b\u0430\u0447\u0435\u043d\u043e \u043f\u043e QR-\u043a\u043e\u0434\u0443 QR1234567890 \u043d\u0430 \u0441\u0443\u043c\u043c\u0443: $75.5\u00ab\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c\u00bb (Observer)\r\n\r\n\u041f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c\u00bb \u2014 \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \r\n\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u00ab\u043e\u0434\u0438\u043d \u043a\u043e \u043c\u043d\u043e\u0433\u0438\u043c\u00bb. \u0415\u0433\u043e \u0441\u0443\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0430: \u043a\u043e\u0433\u0434\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 (\u0441\u0443\u0431\u044a\u0435\u043a\u0442) \u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u0432\u043e\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b (\u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u0438) \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f. \u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e.\r\n\r\n\u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439 \r\n\u0432 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438. \u041a\u043e\u0433\u0434\u0430 \u0430\u0432\u0442\u043e\u0440 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0441\u0442, \u0432\u0438\u0434\u0435\u043e \u0438\u043b\u0438 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e, \u0435\u0433\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 Java.\r\n\r\nimport java.util.ArrayList; import java.util.List; \/\/ \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \r\n\u0434\u043b\u044f \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u0435\u0439 interface Observer { void update(String message); } \/\/ \u041a\u043b\u0430\u0441\u0441 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 Observer class Subscriber implements Observer { @Override public void update(String message) { System.out.println(\"\u041f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435: \" + message); } } \/\/ \u041a\u043b\u0430\u0441\u0441 \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430\u043c class Subject { private List<Observer> observers = new ArrayList<>(); private String state; \/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a public void attach(Observer observer) { observers.add(observer); } \/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u043e\u0432 public void notifyObservers() { for (Observer observer : observers) { observer.update(state); } } \/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f public void setState(String state) { this.state = state; notifyObservers(); } } \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 public class MainObserver { public static void main(String[] args) { Subject subject = new Subject(); Subscriber subscriber = new Subscriber(); subject.attach(subscriber); \/\/ \u041c\u0435\u043d\u044f\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430 subject.setState(\"\u041d\u043e\u0432\u043e\u0441\u0442\u044c: \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 1\"); subject.setState(\"\u041d\u043e\u0432\u043e\u0441\u0442\u044c: \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 2\"); } }\r\n\r\n\u041f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 setState() \u0441\u0443\u0431\u044a\u0435\u043a\u0442 \u0441\u0440\u0430\u0437\u0443 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442 \r\n\u0432\u0441\u0435\u0445 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u0435\u0439 \u043e \u0441\u043c\u0435\u043d\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 notifyObservers(). \u0412 \u043e\u0442\u0432\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 update(), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c:\r\n\r\n\u041f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435: \u041d\u043e\u0432\u043e\u0441\u0442\u044c: \r\n\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 1 \u041f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435: \u041d\u043e\u0432\u043e\u0441\u0442\u044c: \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 2\r\n\r\n\r\n\r\n \r\n\r\n\r\n\u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u0442\u0430\u043a\u0436\u0435:\r\n\r\n\u0428\u0430\u0431\u043b\u043e\u043d \u00ab\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c\u00bb: \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0438\u0442\u0435, \u043a\u0430\u043a \u0442\u0430\u043c \r\n\u043d\u0430 \u041c\u0430\u0440\u0441\u0435 \u00ab\u041f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044c\u00bb (Visitor)\r\n\r\n\u0418 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u2014 \r\n\u00ab\u041f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044c\u00bb. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a \u043a\u043b\u0430\u0441\u0441\u0430\u043c \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u042d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0446\u0435\u043d\u043d\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0435\u0451 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c.\r\n\r\n\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0434\u043b\u044f \u0437\u043e\u043e\u043f\u0430\u0440\u043a\u0430 \u0441 \u0431\u0430\u0437\u043e\u0439 \r\n\u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0436\u0438\u0432\u043e\u0442\u043d\u044b\u0445. \u0414\u043b\u044f \u0438\u0445 \u043a\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u00ab\u041a\u043e\u0440\u043c\u0438\u043b\u044c\u0449\u0438\u043a\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0438\u0434\u0430 \u0436\u0438\u0432\u043e\u0442\u043d\u044b\u0445 \u0438 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0434 \u0441\u0430\u043c\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0436\u0438\u0432\u043e\u0442\u043d\u044b\u0445. \u0415\u0441\u043b\u0438 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043b\u0435\u0447\u0435\u043d\u0438\u044f, \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u00ab\u0412\u0435\u0442\u0435\u0440\u0438\u043d\u0430\u0440\u00bb, \u0438 \u043e\u043d \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u0437\u0430\u0442\u0440\u043e\u043d\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u043e\u0434. \u0414\u043b\u044f \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u043a\u043e\u0440\u043c\u0438\u043c \u0434\u043e\u043c\u0430\u0448\u043d\u0438\u0445 \u043f\u0438\u0442\u043e\u043c\u0446\u0435\u0432.\r\n\r\npublic class MainVisitor { public static void main(String[] args) { \/\/ \r\n\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043e\u043c\u0430\u0448\u043d\u0438\u0445 \u0436\u0438\u0432\u043e\u0442\u043d\u044b\u0445 Animal[] animals = {new Cat(), new Dog()}; \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u0440\u043c\u0438\u0442\u044c \u043d\u0430\u0448\u0438\u0445 \u043f\u0438\u0442\u043e\u043c\u0446\u0435\u0432 AnimalVisitor feedingVisitor = new FeedingVisitor(); \/\/ \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0436\u0438\u0432\u043e\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 accept, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044e \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0436\u0438\u0432\u043e\u0442\u043d\u043e\u0435 for (Animal animal : animals) { animal.accept(feedingVisitor); } } } \/\/ \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0436\u0438\u0432\u043e\u0442\u043d\u044b\u0445 interface Animal { void accept(AnimalVisitor visitor); \/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044f } \/\/ \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u0435\u0439 interface AnimalVisitor { void visit(Cat cat); \/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043a\u043e\u0448\u0435\u043a void visit(Dog dog); \/\/ \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0441\u043e\u0431\u0430\u043a } \/\/ \u041a\u043b\u0430\u0441\u0441 \u043a\u043e\u0448\u043a\u0438 class Cat implements Animal { @Override public void accept(AnimalVisitor visitor) { visitor.visit(this); \/\/ \u041a\u043e\u0448\u043a\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0441\u0435\u0431\u044f \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044e } public void meow() { System.out.println(\"\u041c\u044f\u0443!\"); \/\/ \u041a\u043e\u0448\u043a\u0430 \u043c\u044f\u0443\u043a\u0430\u0435\u0442 } } \/\/ \u041a\u043b\u0430\u0441\u0441 \u0441\u043e\u0431\u0430\u043a\u0438 class Dog implements Animal { @Override public void accept(AnimalVisitor visitor) { visitor.visit(this); \/\/ \u0421\u043e\u0431\u0430\u043a\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0441\u0435\u0431\u044f \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044e } public void bark() { System.out.println(\"\u0413\u0430\u0432!\"); \/\/ \u0421\u043e\u0431\u0430\u043a\u0430 \u043b\u0430\u0435\u0442 } } \/\/ \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u0440\u043c\u0438\u0442\u044c \u0436\u0438\u0432\u043e\u0442\u043d\u044b\u0445 class FeedingVisitor implements AnimalVisitor { @Override public void visit(Cat cat) { System.out.println(\"\u041a\u043e\u0448\u043a\u0430 \u043f\u043e\u043a\u043e\u0440\u043c\u043b\u0435\u043d\u0430!\"); cat.meow(); \/\/ \u041a\u043e\u0448\u043a\u0430 \u043c\u044f\u0443\u043a\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f } @Override public void visit(Dog dog) { System.out.println(\"\u0421\u043e\u0431\u0430\u043a\u0430 \u043f\u043e\u043a\u043e\u0440\u043c\u043b\u0435\u043d\u0430!\"); dog.bark(); \/\/ \u0421\u043e\u0431\u0430\u043a\u0430 \u043b\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f } }\r\n\r\n\u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u0436\u0438\u0432\u043e\u0442\u043d\u043e\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \r\n\u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 accept(). \u0412 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 visit() \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0436\u0438\u0432\u043e\u0442\u043d\u043e\u0433\u043e. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043a\u0430\u0436\u0434\u043e\u0435 \u0436\u0438\u0432\u043e\u0442\u043d\u043e\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043f\u043e\u0440\u0446\u0438\u044e \u0435\u0434\u044b \u0438 \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442 \u043d\u0430\u043c \u0437\u0430 \u044d\u0442\u043e \u0438\u0441\u043a\u0440\u0435\u043d\u043d\u044e\u044e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c:\r\n\r\n\u041a\u043e\u0448\u043a\u0430 \u043f\u043e\u043a\u043e\u0440\u043c\u043b\u0435\u043d\u0430! \u041c\u044f\u0443! \u0421\u043e\u0431\u0430\u043a\u0430 \u043f\u043e\u043a\u043e\u0440\u043c\u043b\u0435\u043d\u0430! \r\n\u0413\u0430\u0432!\r\n\r\n\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435\r\n\r\n\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0432\u044b \u0432 \u043e\u0431\u0449\u0438\u0445 \u0447\u0435\u0440\u0442\u0430\u0445 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0438\u0441\u044c \r\n\u0441 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043e\u0431\u0448\u0438\u0440\u043d\u044b\u0445 \u0442\u0435\u043c \u0432 \u043c\u0438\u0440\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u043a\u043d\u0438\u0433\u0443 \u00ab\u041f\u0440\u0438\u0451\u043c\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u00bb \u2014 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435. \u0412 \u043d\u0430\u0440\u043e\u0434\u0435 \u0435\u0451 \u0430\u0432\u0442\u043e\u0440\u043e\u0432 \u2014 \u042d\u0440\u0438\u0445\u0430 \u0413\u0430\u043c\u043c\u0443, \u0420\u0438\u0447\u0430\u0440\u0434\u0430 \u0425\u0435\u043b\u043c\u0430, \u0420\u0430\u043b\u044c\u0444\u0430 \u0414\u0436\u043e\u043d\u0441\u043e\u043d\u0430 \u0438 \u0414\u0436\u043e\u043d\u0430 \u0412\u043b\u0438\u0441\u0441\u0438\u0434\u0435\u0441\u0430 \u2014 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u00ab\u0411\u0430\u043d\u0434\u0430 \u0447\u0435\u0442\u044b\u0440\u0451\u0445\u00bb. \u0412 \u043a\u043d\u0438\u0433\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u044b 23 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439.\r\n\r\n\u041f\u043e\u0441\u043b\u0435 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0438\u043a\u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \r\n\u043a \u043a\u043d\u0438\u0433\u0435 \u00abHead First. \u041f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u00bb. \u0412 \u043d\u0435\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043d\u0430 14 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u0435 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438. \u0410\u0432\u0442\u043e\u0440\u044b \u043a\u043d\u0438\u0433\u0438 \u2014 \u043d\u043e\u0432\u0430\u044f \u00ab\u0431\u0430\u043d\u0434\u0430 \u0447\u0435\u0442\u044b\u0440\u0451\u0445\u00bb: \u042d\u0440\u0438\u043a \u0424\u0440\u0438\u043c\u0435\u043d, \u042d\u043b\u0438\u0437\u0430\u0431\u0435\u0442 \u0420\u043e\u0431\u0441\u043e\u043d, \u041a\u044d\u0442\u0438 \u0421\u044c\u0435\u0440\u0440\u0430 \u0438 \u0411\u0435\u0440\u0442 \u0411\u0435\u0439\u0442\u0441. \u0422\u0430\u043a\u0436\u0435 \u0441\u043e\u0432\u0435\u0442\u0443\u0435\u043c \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u0441\u0430\u0439\u0442 Refactoring.Guru , \u0433\u0434\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u044b 22 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0438 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434\u043e\u043c.\r\n\r\n\r\n\r\n \r\n\r\n \r\n\r\n\r\n\u0411\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u043f\u0440\u043e \u043a\u043e\u0434 \u2014 \u0432 \u043d\u0430\u0448\u0435\u043c \r\n\u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u043a\u0430\u043d\u0430\u043b\u0435 . \u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435\u0441\u044c!\r\n\r\n\r\n\r\n\u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u0442\u0430\u043a\u0436\u0435:\r\n\r\n- Java Core \u0434\u043b\u044f \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432: \u0440\u043e\u0430\u0434\u043c\u0430\u043f \r\n \r\n- \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u043a\u043b\u0430\u0441\u0441\u044b: 1\u2011\u044f \u0447\u0430\u0441\u0442\u044c \r\n\u0433\u0430\u0439\u0434\u0430 \u043f\u043e \u041e\u041e\u041f \r\n- \u041a\u0430\u043a \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \r\n\u0441 \u043d\u0443\u043b\u044f \r\n\r\n\r\n\r\n\r\n\u041f\u043e\u0434 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043c \u00ab\u0424\u0430\u0431\u0440\u0438\u043a\u0430\u00bb \u043c\u044b \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u043c \r\n\u043e\u0431\u0449\u0435\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0433\u0440\u0443\u043f\u043f\u044b \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0412 \u044d\u0442\u0443 \u0433\u0440\u0443\u043f\u043f\u0443 \u0432\u0445\u043e\u0434\u044f\u0442: \u00ab\u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0430\u00bb, \u00ab\u0424\u0430\u0431\u0440\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434\u00bb \u0438 \u00ab\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0430\u00bb.\r\n\r\n\r\n\r\n\r\n\u0418\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u2014 \u0437\u043d\u0430\u0447\u0438\u0442 \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \r\n\u0434\u0435\u0442\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u043f\u0443\u043b\u044c\u0442 \u043e\u0442 \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u0430 \u2014 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u0430\u043d\u0430\u043b. \u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u00ab\u0424\u0430\u0431\u0440\u0438\u043a\u0430\u00bb \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0437\u0430 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0430.","author":{"@type":"Person","name":"\u0420\u0435\u0434\u0430\u043a\u0446\u0438\u044f \u00ab\u041a\u043e\u0434\u00bb Skillbox\u00a0Media","url":"https:\/\/skillbox.ru\/media\/authors\/code-skillbox-media\/"},"publisher":{"@type":"Organization","name":"Skillbox","logo":{"@type":"ImageObject","url":"https:\/\/skillbox.ru\/static\/images\/skillbox.png"}},"mainEntityOfPage":{"@type":"WebPage","url":"https:\/\/skillbox.ru\/media\/code\/osnovnye-patterny-proektirovaniya-na-java\/"},"datePublished":"2025-03-17T07:30:00Z","dateModified":"2025-03-17T18:27:39Z","image":{"@type":"ImageObject","url":["https:\/\/248006.selcdn.ru\/main\/iblock\/91d\/91d91c4bc236a5120da19e0ed9b3c2a7\/9139ac8c8095db89cf99ef8aeb0cf079.png"]},"description":"\u041f\u0440\u043e\u0441\u0442\u043e\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u043a\u043e\u0434\u0430."}
</script><script data-skip-moving="true" id="FiMjZmipVK5U4ODg">if (window.relap) window.relap.ar('FiMjZmipVK5U4ODg');</script> </div>
<script>
window.Section_id = 10;
</script>
</div>
</main>
<footer class="without-buttons">
<div class="footer__wrapper container">
<div class="footer__firstgroup">
<section class="footer__contactbox">
<address class="footer__contacts">
<p class="footer__contacts-block">
<a class="footer__phone link" href="tel:+74951540915">8 (800) 500-05-22</a>
<span class="footer__phone-caption">Контактный центр</span>
</p>
<p class="footer__contacts-block">
<a class="footer__phone link" href="tel:+74952915987">+7(495) 291-59-87</a>
<span class="footer__phone-caption">Отдел заботы о пользователях</span>
</p>
<p class="footer__address"> Москва, Ленинский проспект, дом 6, строение 20</p>
</address>
<ul class="social-contacts footer__social">
<li>
<a class="social-contacts__item" href="https://vk.com/skillbox_education"
aria-label="Вконтакте">
<img src="/static/images/footer/soc_vk.svg"/>
</a>
</li>
<li>
<a class="social-contacts__item"
href="https://www.youtube.com/channel/UC2FJq-Rr7v4SlKAoM7x0ZhA" aria-label="YouTube">
<img src="/static/images/footer/soc_tube.svg"/>
</a>
</li>
<li>
<a class="social-contacts__item" href="tg://resolve?domain=skillboxru"
aria-label="Telegram">
<img src="/static/images/footer/soc_tg.svg"/>
</a>
</li>
</ul>
<div class="footer__age-limit">
16+
</div>
</section>
<section class="footer__rewardbox">
<ul class="rewards footer__rewards">
<li>
<span class="rewards__item">
<img src="/static/images/footer/footer_runet.svg" alt=""/>
<span>Премии Рунета</span>
<span>2018, 2019, 2020</span>
</span>
</li>
</ul>
</section>
</div>
<section class="footer__linksbox">
<ul class="links__list links__list--courses">
<li class="links__item links__item--header">Все направления</li>
<li class="links__item"><a href="/code/?utm_source=media&utm_medium=button&utm_campaign=footerlink_code&utm_term=footer">Программирование</a></li>
<li class="links__item"><a href="/design/?utm_source=media&utm_medium=button&utm_campaign=footerlink_design&utm_term=footer">Дизайн</a></li>
<li class="links__item"><a href="/marketing/?utm_source=media&utm_medium=button&utm_campaign=footerlink_marketing&utm_term=footer">Маркетинг</a></li>
<li class="links__item"><a href="/management/?utm_source=media&utm_medium=button&utm_campaign=footerlink_management&utm_term=footer">Управление</a></li>
<li class="links__item"><a href="/games/?utm_source=media&utm_medium=button&utm_campaign=footerlink_gamedev&utm_term=footer">Игры</a></li>
<li class="links__item"><a href="/multimedia/?utm_source=media&utm_medium=button&utm_campaign=footerlink_multimedia&utm_term=footer">Мультимедиа</a></li>
<li class="links__item"><a href="/psychology/?utm_source=media&utm_medium=button&utm_campaign=footerlink_psychology&utm_term=footer">Психология</a></li>
<li class="links__item"><a href="/general-development/?utm_source=media&utm_medium=button&utm_campaign=footerlink_general-development&utm_term=footer">Общее развитие</a></li>
<li class="links__item"><a href="/engineering/?utm_source=media&utm_medium=button&utm_campaign=footerlink_engineering&utm_term=footer">Инженерия</a></li>
<li class="links__item"><a href="/english/?utm_source=media&utm_medium=button&utm_campaign=footerlink_english&utm_term=footer">Английский язык</a></li>
<li class="links__item"><a href="/other/?utm_source=media&utm_medium=button&utm_campaign=footerlink_other&utm_term=footer">Другое</a></li>
</ul>
<ul class="links__list links__list--about">
<li class="links__item links__item--header">О Skillbox</li>
<li class="links__item"><a href="/company/?utm_source=media&utm_medium=button&utm_campaign=footerlink_aboutskillbox&utm_term=footer">О Платформе</a></li>
<li class="links__item"><a href="/career/?utm_source=media&utm_medium=button&utm_campaign=footerlink_careercentr&utm_term=footer"> Центр карьеры</a></li>
<li class="links__item"><a href="/otzyvy/?utm_source=media&utm_medium=button&utm_campaign=footerlink_testimonials&utm_term=footer">Отзывы</a></li>
<li class="links__item"><a href="/contacts/?utm_source=media&utm_medium=button&utm_campaign=footerlink_skillboxcontacts&utm_term=footer">Контакты</a></li>
<li class="links__item"><a href="/jobs/?utm_source=media&utm_medium=button&utm_campaign=footerlink_jobs&utm_term=footer">Вакансии</a></li>
<li class="links__item"><a href="/teachers/?utm_source=media&utm_medium=button&utm_campaign=footerlink_school&utm_term=footer">Школа кураторов</a></li>
<li class="links__item"><a href="/sale/free/?utm_source=media&utm_medium=button&utm_campaign=footerlink_free&utm_term=footer">Бесплатно</a></li>
<li class="links__item"><a href="/media/topic/tests/?utm_source=media&utm_medium=button&utm_campaign=footerlink_tests&utm_term=footer">Онлайн-тесты</a></li>
</ul>
<ul class="links__list links__list--webinar">
<li class="links__item links__item--header">Вебинары</li>
<li class="links__item"><a href="https://live.skillbox.ru/?utm_source=media&utm_medium=button&utm_campaign=footerlink_webinars&utm_term=footer" target="_blank" rel="noopener">Все вебинары</a></li>
<li class="links__item"><a href="https://live.skillbox.ru/playlists/?utm_source=media&utm_medium=button&utm_campaign=footerlink_playlists&utm_term=footer" target="_blank" rel="noopener">Плейлисты</a></li>
<li class="links__item"><a href="https://live.skillbox.ru/calendar/?utm_source=media&utm_medium=button&utm_campaign=footerlink_schedule&utm_term=footer" target="_blank" rel="noopener">Расписание</a></li>
</ul>
<ul class="links__list links__list--last">
<li class="links__item links__journal"><a href="/media/" target="_blank" rel="noopener">Медиа</a></li>
<li class="links__item"><a href="https://partners.skillbox.ru/?utm_source=media&utm_medium=button&utm_campaign=footerlink_partners&utm_term=footer" target="_blank" rel="noopener">Партнерская программа</a></li>
<li class="links__item"><a href="https://b2b.skillbox.ru/?utm_source=media&utm_medium=button&utm_campaign=footerlink_b2b&utm_term=footer" target="_blank" rel="noopener">Корпоративным клиентам</a></li>
<li class="links__item"><a href="https://career.skillbox.ru/?utm_source=media&utm_medium=button&utm_campaign=footerlink_employees&utm_term=footer" target="_blank" rel="noopener">Для работодателей</a></li>
</ul>
</section>
</div>
<div class="footer__underline container">
<span class="footer__copy">
© Skillbox, 2026 </span>
<div>
<span class="footer__oferta">
<a href="/oferta.pdf" target="_blank">Договор оферты</a>
</span>
<span class="footer__payment">
<a href="/payments/" target="_blank">Оплата</a>
</span>
<span class="footer__use-policy">
<a href="/terms_of_use.pdf" target="_blank">Правила пользования Платформой</a>
<a href="/privacy_policy.pdf" target="_blank">Политика конфиденциальности</a>
</span>
</div>
</div>
</footer>
<div class="cookies">
<p class="cookies__desc">
Пользуясь нашим сайтом, вы соглашаетесь с тем, что
<a href="https://skillbox.ru/privacy_policy.pdf" target="_blank" rel="noopener"
type="application/pdf">мы используем cookies</a> 🍪
</p>
<button type="button" class="cookies__button">
Окей
</button>
</div>
<div class="subscribe-popup subscribe">
<div class="subscribe-popup__spacer-mobile"></div>
<div class="subscribe-popup__row-content ">
<button class="subscribe__close"></button>
<div class="subscribe__content">
<div data-subscribe-popup-success class="hidden">
<h2 class="subscribe__header-success">Спасибо за подписку! Забирайте 5 бесплатных курсов:</h2>
<ul class="subscribe__list-block">
<li>Найти себя в IT за 5 дней</li>
<li>Как найти себя в дизайне в 2025 году</li>
<li>Интерьеры, мебель, ландшафт и декорирование</li>
<li>Интернет-маркетинг на практике</li>
<li>Бизнес-аналитик, продакт- и проджект-менеджер</li>
</ul>
<div class="subscribe__btns-el">
<a
target="_blank"
href="https://refer.id/?bot=skillbox_main_bot&platform=telegram&verbose_name=Skillbox&bot_avatar=https://designer.ftrcdn.com/uploads/bot_avatars/medium_54ab1ce8c393eb3df1474846ce0a0e2c.png&n=137050&c=9209&bc_number=890&?utm_source=media&utm_medium=&utm_campaign=all_all_media_banners_invite_sbornik-890_all_bot_skillbox"
class="subscribe__el-btn">Получить доступ</a>
</div>
</div>
<div data-subscribe-popup-content>
<h2 class="subscribe__header">У нас есть классные рассылки!</h2>
<form action="/media/code/osnovnye-patterny-proektirovaniya-na-java/" class="newsletter-form page-subscription__form3" data-type="popup">
<input type="hidden" name="action" value="subscribe">
<div class="subscribe__checkboxes"></div>
<div class="subscribe__email email_popup">
<input class="subscribe-form__input" type="text" name="email" placeholder="Email" >
<span class="subscribe-form__label-name">Электронная почта</span>
<button type="submit" class="popup-btn-click">Подписаться</button>
<span class="email__error">Поле необходимо заполнить</span>
</div>
<div class="subscribe-popup__checkbox-end">
<div class="subscribe-popup__checkbox-item" data-checkbox-personal-data>
<div class="subscribe__checkbox">
<input type="checkbox" name="agreements[PERS]" id="isCheckTrue" value="1" data-checkbox-personal-data-input>
<label for="isCheckTrue"><span>Я согласен на <a target="_blank" href="https://skillbox.ru/legal-docs/chou/file/privacy_policy/version-290425.pdf">обработку персональных данных</a></span></label>
</div>
<span class="email__error">Нужно ваше согласие</span>
</div>
<div class="subscribe__bottom">
<span>Нажимая на кнопку, я соглашаюсь с <a target="_blank" href="https://skillbox.ru/legal-docs/skillbox/file/terms_of_use/version-300824.pdf">правилами пользования Платформой</a></span>
</div>
<div class="subscribe-popup__checkbox-item" data-checkbox-personal-data-two>
<div class="subscribe__checkbox subscribe__checkbox--end" >
<input type="checkbox" name="agreements[ADS]" id="isAdsCalls" value="1" checked="" data-checkbox-personal-data-input-two>
<label for="isAdsCalls">Я согласен <a target="_blank" href="https://skillbox.ru/legal-docs/chou/file/soglasie-na-poluchenie-reklamy.pdf">получать рекламу и звонки</a></label>
</div>
<span class="email__error">Нужно ваше согласие</span>
</div>
</div>
</form>
</div>
</div>
</div>
<!-- src="/static/images/articles/subscribe-popup-img.png" -->
</div>
<div class="bg-modal-overlay bg-modal-overlay--transparent"></div>
<script data-skip-moving="true" id="popup__data--formatted">
$(".popup-btn-click").on("click" , function (){
var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
let input = $(this).closest(".subscribe__email").find(".subscribe-form__input");
let inputValue = input.val();
if(emailPattern.test(inputValue)) {
(window["rrApiOnReady"] = window["rrApiOnReady"] || []).push(function() { rrApi.setEmail(inputValue);});
}
});
/*
window.popupData = {
"8": {
header: 'У нас есть классные рассылки про дизайн!!!',
category: 'Дизайн',
checkboxes: [
'Лучшие статьи про Дизайн',
'«Типографика без боли»'
]
},
"10": {
header: 'У нас есть классные рассылки про код',
category: 'Код',
checkboxes: [
'Лучшие статьи про Код и Людей кода',
'«Жизнь без багов»'
]
},
"18": {
category: 'Геймдев',
checkboxes: []
},
"21": {
header: 'У нас есть классные рассылки про бизнес',
category: 'Бизнес',
checkboxes: [
'Лучшие статьи про Бизнес',
'«Цифровая жизнь»',
'«EdTech по полочкам»'
]
},
"9": {
header: 'У нас есть классные рассылки про бизнес',
category: 'Маркетинг',
checkboxes: [
'Лучшие статьи про Бизнес',
'«Цифровая жизнь»',
'«EdTech по полочкам»'
]
},
"11": {
header: 'У нас есть классные рассылки про бизнес',
category: 'Управление',
checkboxes: [
'Лучшие статьи про Бизнес',
'«Цифровая жизнь»',
'«EdTech по полочкам»'
]
},
"17": {
category: 'Развитие',
checkboxes: []
},
"22": {
header: 'У нас есть классные рассылки про образование',
category: 'Образование',
checkboxes: [
'Лучшие статьи про Образование',
'«EdTech по полочкам»',
'«Мой успешный онлайн-курс»'
]
},
}
*/
window.popupData = {"header":"\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 - \u043d\u0430 \u043f\u043e\u0447\u0442\u0443!\u003Cbr\/\u003E\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0442\u0435\u043c\u0443 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438\u003Cbr\/\u003E\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 5 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432:","category":"\u041a\u043e\u0434","checkboxes":{"23":"\u041c\u0435\u043d\u0435\u0434\u0436\u043c\u0435\u043d\u0442","24":"\u041c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433","26":"\u041a\u043e\u0440\u043f. \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435","13":"\u0414\u0438\u0437\u0430\u0439\u043d","16":"\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","15":"\u041e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435","17":"\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u0433\u0440","18":"\u041f\u0441\u0438\u0445\u043e\u043b\u043e\u0433\u0438\u044f, \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e"},"code":"code","scroll":true};
window.subscribePopupShow = 1;
</script>
<div class="copied">
<img src="/static/images/articles/done-circle.svg" alt="" class="copied__icon">
<p class="copied__text">
Ссылка скопирована
</p>
</div>
<!-- <style>@font-face{font-display:swap;font-family:Graphik;font-weight:500;font-style:normal;src:url(https://248006.selcdn.ru/Shared/fonts/GraphikLCTT-VA-Medium.woff2) format("woff2")}@font-face{font-display:swap;font-family:Graphik;font-weight:700;font-style:normal;src:url(https://248006.selcdn.ru/Shared/fonts/GraphikLCTT-VA-Bold.woff2) format("woff2")}.universal-notice{box-sizing:border-box;text-decoration:none;display:none;min-height:48px;color:var(--banner-color);background-color:var(--banner-bg);overflow:hidden;font-family:Graphik,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-transition:opacity .25s ease-in-out;transition:opacity .25s ease-in-out}.universal-notice *{box-sizing:inherit}.universal-notice.universal-notice--active{display:block}.universal-notice--bitrix{z-index:1000}.universal-notice__wrapper{position:relative;-webkit-box-pack:start;justify-content:flex-start;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;margin-left:12px;padding:4px 0}.universal-notice__title{position:relative;flex-shrink:0;width:132px;margin-right:27px;font-size:14px;line-height:20px;text-transform:uppercase}.universal-notice__timer{display:none;margin:0;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.universal-notice__button{flex-shrink:0;min-width:120px;padding:8px 12px;border-radius:25px;font-weight:500;font-size:12px;line-height:16px;color:#3925b7;text-align:center;text-transform:uppercase;background-color:#ffa6a6}@media (min-width:768px){.universal-notice{min-height:72px}.universal-notice__wrapper{-webkit-box-pack:center;justify-content:center;height:72px;margin:0}.universal-notice__title{width:252px;margin-right:32px;margin-left:20px;font-size:24px;line-height:32px}.universal-notice__button{min-width:200px;margin-right:20px;padding:14px 36px;font-size:16px;line-height:20px}}@media (min-width:768px) and (max-width:0px){.universal-notice{min-height:72px}.universal-notice__wrapper{-webkit-box-pack:center;justify-content:center;height:72px;margin:0}.universal-notice__title{width:252px;margin-right:32px;margin-left:20px;font-size:24px;line-height:32px}.universal-notice__button{min-width:200px;margin-right:20px;padding:14px 36px;font-size:16px;line-height:20px}}@media (min-width:1280px) and (max-width:0px){.universal-notice__wrapper{padding:0}.universal-notice__title{width:unset;margin-right:76px}.universal-notice__timer{flex-shrink:0;margin-right:32px;font-weight:700;font-size:24px;line-height:32px}.universal-notice__timer.js-universal-notice-active{display:-webkit-box;display:flex}.universal-notice__days{margin-right:5px}}@media (min-width:1280px){.universal-notice__wrapper{padding:0}.universal-notice__title{width:unset;margin-right:76px}.universal-notice__timer{flex-shrink:0;margin-right:32px;font-weight:700;font-size:24px;line-height:32px}.universal-notice__timer.js-universal-notice-active{display:-webkit-box;display:flex}.universal-notice__days{margin-right:5px}}</style>-->
</body>
</html>