[ÐопÑоÑÑ Ð´Ð»Ñ ÑобеÑедованиÑ](README.md) # Ð¨Ð°Ð±Ð»Ð¾Ð½Ñ Ð¿ÑоекÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ + [ЧÑо Ñакое _«Ñаблон пÑоекÑиÑованиÑ»_?](#ЧÑо-Ñакое-Ñаблон-пÑоекÑиÑованиÑ) + [ÐазовиÑе оÑновнÑе Ñ Ð°ÑакÑеÑиÑÑики Ñаблонов.](#ÐазовиÑе-оÑновнÑе-Ñ Ð°ÑакÑеÑиÑÑики-Ñаблонов) + [Ð¢Ð¸Ð¿Ñ Ñаблонов пÑоекÑиÑованиÑ.](#ТипÑ-Ñаблонов-пÑоекÑиÑованиÑ) + [ÐÑиведиÑе пÑимеÑÑ Ð¾ÑновнÑÑ Ñаблонов пÑоекÑиÑованиÑ.](#ÐÑиведиÑе-пÑимеÑÑ-оÑновнÑÑ -Ñаблонов-пÑоекÑиÑованиÑ) + [ÐÑиведиÑе пÑимеÑÑ Ð¿Ð¾ÑождаÑÑÐ¸Ñ Ñаблонов пÑоекÑиÑованиÑ.](#ÐÑиведиÑе-пÑимеÑÑ-поÑождаÑÑÐ¸Ñ -Ñаблонов-пÑоекÑиÑованиÑ) + [ÐÑиведиÑе пÑимеÑÑ ÑÑÑÑкÑÑÑнÑÑ Ñаблонов пÑоекÑиÑованиÑ.](#ÐÑиведиÑе-пÑимеÑÑ-ÑÑÑÑкÑÑÑнÑÑ -Ñаблонов-пÑоекÑиÑованиÑ) + [ÐÑиведиÑе пÑимеÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½ÑеÑÐºÐ¸Ñ Ñаблонов пÑоекÑиÑованиÑ.](#ÐÑиведиÑе-пÑимеÑÑ-поведенÑеÑÐºÐ¸Ñ -Ñаблонов-пÑоекÑиÑованиÑ) + [ЧÑо Ñакое _«анÑипаÑÑеÑн»_? Ðакие анÑипаÑÑеÑÐ½Ñ Ð²Ñ Ð·Ð½Ð°ÐµÑе?](#ЧÑо-Ñакое-анÑипаÑÑеÑн-Ðакие-анÑипаÑÑеÑнÑ-вÑ-знаеÑе) + [ЧÑо Ñакое _Dependency Injection_?](#ЧÑо-Ñакое-dependency-injection) ## ЧÑо Ñакое _«Ñаблон пÑоекÑиÑованиÑ»_? __Шаблон (паÑÑеÑн) пÑоекÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ (design pattern)__ â ÑÑо пÑовеÑенное и гоÑовое к иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑеÑение. ÐÑо не клаÑÑ Ð¸ не библиоÑека, коÑоÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ подклÑÑиÑÑ Ðº пÑоекÑÑ, ÑÑо неÑÑо болÑÑее - он не завиÑÐ¸Ñ Ð¾Ñ ÑзÑка пÑогÑаммиÑованиÑ, не ÑвлÑеÑÑÑ Ð·Ð°ÐºÐ¾Ð½ÑеннÑм обÑазÑом, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑÑмо пÑеобÑазован в код и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñеализован по ÑÐ°Ð·Ð½Ð¾Ð¼Ñ Ð² ÑазнÑÑ ÑзÑÐºÐ°Ñ Ð¿ÑогÑаммиÑованиÑ. ÐлÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñаблонов: + Ñнижение ÑложноÑÑи ÑазÑабоÑки за ÑÑÑÑ Ð³Ð¾ÑовÑÑ Ð°Ð±ÑÑÑакÑий Ð´Ð»Ñ ÑеÑÐµÐ½Ð¸Ñ Ñелого клаÑÑа пÑоблем. + облегÑение коммÑникаÑии Ð¼ÐµÐ¶Ð´Ñ ÑазÑабоÑÑиками, позволÑÑ ÑÑÑлаÑÑÑÑ Ð½Ð° извеÑÑнÑе ÑаблонÑ. + ÑниÑикаÑÐ¸Ñ Ð´ÐµÑалей ÑеÑений: модÑлей и ÑлеменÑов пÑоекÑа. + возможноÑÑÑ Ð¾ÑÑÑкав ÑдаÑное ÑеÑение, полÑзоваÑÑÑÑ Ð¸Ð¼ Ñнова и Ñнова. + помоÑÑ Ð² вÑбоÑе вÑбÑаÑÑ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑего ваÑианÑа пÑоекÑиÑованиÑ. ÐинÑÑÑ: + Ñлепое Ñледование некоÑоÑÐ¾Ð¼Ñ Ð²ÑбÑÐ°Ð½Ð½Ð¾Ð¼Ñ ÑÐ°Ð±Ð»Ð¾Ð½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к ÑÑÐ»Ð¾Ð¶Ð½ÐµÐ½Ð¸Ñ Ð¿ÑогÑаммÑ. + желание попÑобоваÑÑ Ð½ÐµÐºÐ¾ÑоÑÑй Ñаблон в деле без оÑобÑÑ Ð½Ð° Ñо оÑнований. [к оглавлениÑ](#ШаблонÑ-пÑоекÑиÑованиÑ) ## ÐазовиÑе оÑновнÑе Ñ Ð°ÑакÑеÑиÑÑики Ñаблонов. + __ÐмÑ__ - вÑе ÑÐ°Ð±Ð»Ð¾Ð½Ñ Ð¸Ð¼ÐµÑÑ ÑникалÑное имÑ, ÑлÑжаÑее Ð´Ð»Ñ Ð¸Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑии; + __ÐазнаÑение__ назнаÑение данного Ñаблона; + __ÐадаÑа__ - задаÑа, коÑоÑÑÑ Ñаблон позволÑÐµÑ ÑеÑиÑÑ; + __СпоÑоб ÑеÑениÑ__ - ÑпоÑоб, пÑедлагаемÑй в Ñаблоне Ð´Ð»Ñ ÑеÑÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ñи в Ñом конÑекÑÑе, где ÑÑÐ¾Ñ Ñаблон бÑл найден; + __УÑаÑÑники__ - ÑÑÑноÑÑи, пÑинимаÑÑие ÑÑаÑÑие в ÑеÑении задаÑи; + __СледÑÑвиÑ__ - поÑледÑÑÐ²Ð¸Ñ Ð¾Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñаблона как ÑезÑлÑÑÐ°Ñ Ð´ÐµÐ¹ÑÑвий, вÑполнÑемÑÑ Ð² Ñаблоне; + __РеализаÑиÑ__ - возможнÑй ваÑÐ¸Ð°Ð½Ñ ÑеализаÑии Ñаблона. [к оглавлениÑ](#ШаблонÑ-пÑоекÑиÑованиÑ) ## Ð¢Ð¸Ð¿Ñ Ñаблонов пÑоекÑиÑованиÑ. + ÐÑновнÑе (Fundamental) - оÑновнÑе ÑÑÑоиÑелÑнÑе блоки дÑÑÐ³Ð¸Ñ Ñаблонов. ÐолÑÑинÑÑво дÑÑÐ³Ð¸Ñ Ñаблонов иÑполÑзÑÐµÑ ÑÑи ÑÐ°Ð±Ð»Ð¾Ð½Ñ Ð² Ñой или иной ÑоÑме. + ÐоÑождаÑÑие ÑÐ°Ð±Ð»Ð¾Ð½Ñ (Creational) â ÑÐ°Ð±Ð»Ð¾Ð½Ñ Ð¿ÑоекÑиÑованиÑ, коÑоÑÑе абÑÑÑагиÑÑÑÑ Ð¿ÑоÑеÑÑ Ñоздание ÑкземплÑÑа. Ðни позволÑÑÑ ÑделаÑÑ ÑиÑÑÐµÐ¼Ñ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимой Ð¾Ñ ÑпоÑоба ÑозданиÑ, композиÑии и пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑов. Шаблон, поÑождаÑÑий клаÑÑÑ, иÑполÑзÑÐµÑ Ð½Ð°Ñледование, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ ÑозданнÑй обÑекÑ, а Ñаблон, поÑождаÑÑий обÑекÑÑ, делегиÑÑÐµÑ Ñоздание обÑекÑов дÑÑÐ³Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ. + СÑÑÑкÑÑÑнÑе ÑÐ°Ð±Ð»Ð¾Ð½Ñ (Structural) опÑеделÑÑÑ ÑазлиÑнÑе ÑложнÑе ÑÑÑÑкÑÑÑÑ, коÑоÑÑе изменÑÑÑ Ð¸Ð½ÑеÑÑÐµÐ¹Ñ Ñже ÑÑÑеÑÑвÑÑÑÐ¸Ñ Ð¾Ð±ÑекÑов или его ÑеализаÑиÑ, позволÑÑ Ð¾Ð±Ð»ÐµÐ³ÑиÑÑ ÑазÑабоÑÐºÑ Ð¸ опÑимизиÑоваÑÑ Ð¿ÑогÑаммÑ. + ÐоведенÑеÑкие ÑÐ°Ð±Ð»Ð¾Ð½Ñ (Behavioral) опÑеделÑÑÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑвие Ð¼ÐµÐ¶Ð´Ñ Ð¾Ð±ÑекÑами, ÑвелиÑÐ¸Ð²Ð°Ñ Ñаким обÑазом его гибкоÑÑÑ. [к оглавлениÑ](#ШаблонÑ-пÑоекÑиÑованиÑ) ## ÐÑиведиÑе пÑимеÑÑ Ð¾ÑновнÑÑ Ñаблонов пÑоекÑиÑованиÑ. + __ÐелегиÑование (Delegation pattern)__ - СÑÑноÑÑÑ Ð²Ð½ÐµÑне вÑÑÐ°Ð¶Ð°ÐµÑ Ð½ÐµÐºÐ¾ÑоÑое поведение, но в ÑеалÑноÑÑи пеÑедаÑÑ Ð¾ÑвеÑÑÑвенноÑÑÑ Ð·Ð° вÑполнение ÑÑого Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÑвÑÐ·Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ. + __ФÑнкÑионалÑнÑй дизайн (Functional design)__ - ÐаÑанÑиÑÑеÑ, ÑÑо ÐºÐ°Ð¶Ð´Ð°Ñ ÑÑÑноÑÑÑ Ð¸Ð¼ÐµÐµÑ ÑолÑко Ð¾Ð´Ð½Ñ Ð¾Ð±ÑзанноÑÑÑ Ð¸ иÑполнÑÐµÑ ÐµÑ Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ñмом побоÑнÑÑ ÑÑÑекÑов на дÑÑгие. + __ÐеизменÑемÑй инÑеÑÑÐµÐ¹Ñ (Immutable interface)__ - Создание неизменÑемого обÑекÑа. + __ÐнÑеÑÑÐµÐ¹Ñ (Interface)__ - ÐбÑий меÑод ÑÑÑÑкÑÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÑÑноÑÑей облегÑаÑÑий Ð¸Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ. + __ÐнÑеÑÑейÑ-маÑÐºÐµÑ (Marker interface)__ - РкаÑеÑÑве аÑÑибÑÑа (как помеÑки обÑекÑной ÑÑÑноÑÑи) пÑименÑеÑÑÑ Ð½Ð°Ð»Ð¸Ñие или оÑÑÑÑÑÑвие ÑеализаÑии инÑеÑÑейÑа-маÑкеÑа. Ð ÑовÑеменнÑÑ ÑзÑÐºÐ°Ñ Ð¿ÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¼ÐµÑÑо ÑÑого пÑименÑÑÑÑÑ Ð°ÑÑибÑÑÑ Ð¸Ð»Ð¸ анноÑаÑии. + __ÐонÑÐµÐ¹Ð½ÐµÑ ÑвойÑÑв (Property container)__ - ÐозволÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑвойÑÑва ÑÑÑноÑÑи в конÑÐµÐ¹Ð½ÐµÑ Ð²Ð½ÑÑÑи ÑебÑ, вмеÑÑо ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ñми ÑвойÑÑвами. + __Ðанал ÑобÑÑий (Event channel)__ - СоздаÑÑ ÑенÑÑализованнÑй канал Ð´Ð»Ñ ÑобÑÑий. ÐÑполÑзÑÐµÑ ÑÑÑноÑÑÑ-пÑедÑÑавиÑÐµÐ»Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки и ÑÑÑноÑÑÑ-пÑедÑÑавиÑÐµÐ»Ñ Ð´Ð»Ñ Ð¿ÑбликаÑии ÑобÑÑÐ¸Ñ Ð² канале. ÐÑедÑÑавиÑÐµÐ»Ñ ÑÑÑеÑÑвÑÐµÑ Ð¾ÑделÑно Ð¾Ñ ÑеалÑного издаÑÐµÐ»Ñ Ð¸Ð»Ð¸ подпиÑÑика. ÐодпиÑÑик Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑаÑÑ Ð¾Ð¿ÑбликованнÑе ÑобÑÑÐ¸Ñ Ð¾Ñ Ð±Ð¾Ð»ÐµÐµ Ñем одной ÑÑÑноÑÑи, даже еÑли он заÑегиÑÑÑиÑован ÑолÑко на одном канале. [к оглавлениÑ](#ШаблонÑ-пÑоекÑиÑованиÑ) ## ÐÑиведиÑе пÑимеÑÑ Ð¿Ð¾ÑождаÑÑÐ¸Ñ Ñаблонов пÑоекÑиÑованиÑ. + __ÐбÑÑÑакÑÐ½Ð°Ñ ÑабÑика (Abstract factory)__ - (ФабÑика ÑабÑик) ÑÑо поÑождаÑÑий паÑÑеÑн пÑоекÑиÑованиÑ, коÑоÑÑй позволÑÐµÑ ÑоздаваÑÑ ÑемейÑÑва ÑвÑзаннÑÑ Ð¾Ð±ÑекÑов, не пÑивÑзÑваÑÑÑ Ðº конкÑеÑнÑм клаÑÑам ÑоздаваемÑÑ Ð¾Ð±ÑекÑов. ÐÑимеÑ: + __СÑÑоиÑÐµÐ»Ñ (Builder)__ - ÑÑо поÑождаÑÑий паÑÑеÑн пÑоекÑиÑованиÑ, коÑоÑÑй позволÑÐµÑ ÑоздаваÑÑ ÑложнÑе обÑекÑÑ Ð¿Ð¾Ñагово. СÑÑоиÑÐµÐ»Ñ Ð´Ð°ÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¸ÑполÑзоваÑÑ Ð¾Ð´Ð¸Ð½ и ÑÐ¾Ñ Ð¶Ðµ код ÑÑÑоиÑелÑÑÑва Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑазнÑÑ Ð¿ÑедÑÑавлений обÑекÑов. ÐÑимеÑ: StringBuilder + __ФабÑиÑнÑй меÑод (Factory method)__ - ÑÑо поÑождаÑÑий паÑÑеÑн пÑоекÑиÑованиÑ, коÑоÑÑй опÑеделÑÐµÑ Ð¾Ð±Ñий инÑеÑÑÐµÐ¹Ñ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑов в ÑÑпеÑклаÑÑе, позволÑÑ Ð¿Ð¾Ð´ÐºÐ»Ð°ÑÑам изменÑÑÑ Ñип ÑоздаваемÑÑ Ð¾Ð±ÑекÑов. + __ÐÑоÑоÑип (Prototype)__ - ÑÑо поÑождаÑÑий паÑÑеÑн пÑоекÑиÑованиÑ, коÑоÑÑй позволÑÐµÑ ÐºÐ¾Ð¿Ð¸ÑоваÑÑ Ð¾Ð±ÑекÑÑ, не вдаваÑÑÑ Ð² подÑобноÑÑи Ð¸Ñ ÑеализаÑии. + __ÐдиноÑка (Singleton)__ - ÑÑо поÑождаÑÑий паÑÑеÑн пÑоекÑиÑованиÑ, коÑоÑÑй гаÑанÑиÑÑеÑ, ÑÑо Ñ ÐºÐ»Ð°ÑÑа еÑÑÑ ÑолÑко один ÑкземплÑÑ, и пÑедоÑÑавлÑÐµÑ Ðº Ð½ÐµÐ¼Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑÑ ÑоÑÐºÑ Ð´Ð¾ÑÑÑпа. [к оглавлениÑ](#ШаблонÑ-пÑоекÑиÑованиÑ) ## ÐбÑÑÑакÑÐ½Ð°Ñ ÑабÑика ÐÑедÑÑавÑÑе, ÑÑо Ð²Ñ Ð¿Ð¸ÑеÑе ÑимÑлÑÑÐ¾Ñ Ð¼ÐµÐ±ÐµÐ»Ñного магазина. ÐÐ°Ñ ÐºÐ¾Ð´ ÑодеÑжиÑ: 1) СемейÑÑво завиÑимÑÑ Ð¿ÑодÑкÑов. Скажем, ÐÑеÑло + Ðиван + СÑолик. 2) ÐеÑколÑко ваÑиаÑий ÑÑого ÑемейÑÑва. ÐапÑимеÑ, пÑодÑкÑÑ ÐÑеÑло, Ðиван и СÑолик пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð² ÑÑÑÑ ÑазнÑÑ ÑÑилÑÑ : ÐÑ-деко, ÐикÑоÑианÑком и ÐодеÑне. Ðам нÑжен Ñакой ÑпоÑоб ÑоздаваÑÑ Ð¾Ð±ÑекÑÑ Ð¿ÑодÑкÑов, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ ÑоÑеÑалиÑÑ Ñ Ð´ÑÑгими пÑодÑкÑами Ñого же ÑемейÑÑва. ÐÑо важно, Ñак как клиенÑÑ ÑаÑÑÑÑаиваÑÑÑÑ, еÑли полÑÑаÑÑ Ð½ÐµÑоÑеÑаÑÑÑÑÑÑ Ð¼ÐµÐ±ÐµÐ»Ñ. ÐÑоме Ñого, Ð²Ñ Ð½Ðµ Ñ Ð¾ÑиÑе вноÑиÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑÑÑеÑÑвÑÑÑий код пÑи добавлении новÑÑ Ð¿ÑодÑкÑов или ÑемейcÑв в пÑогÑаммÑ. ÐоÑÑавÑики ÑаÑÑо обновлÑÑÑ Ñвои каÑалоги, и Ð²Ñ Ð±Ñ Ð½Ðµ Ñ Ð¾Ñели менÑÑÑ Ñже напиÑаннÑй код каждÑй Ñаз пÑи полÑÑении новÑÑ Ð¼Ð¾Ð´ÐµÐ»ÐµÐ¹ мебели. __РеÑение__ ÐÐ»Ñ Ð½Ð°Ñала паÑÑеÑн ÐбÑÑÑакÑÐ½Ð°Ñ ÑабÑика пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ Ð²ÑделиÑÑ Ð¾Ð±Ñие инÑеÑÑейÑÑ Ð´Ð»Ñ Ð¾ÑделÑнÑÑ Ð¿ÑодÑкÑов, ÑоÑÑавлÑÑÑÐ¸Ñ ÑемейÑÑва. Так, вÑе ваÑиаÑии кÑеÑел полÑÑÐ°Ñ Ð¾Ð±Ñий инÑеÑÑÐµÐ¹Ñ ÐÑеÑло, вÑе Ð´Ð¸Ð²Ð°Ð½Ñ ÑеализÑÑÑ Ð¸Ð½ÑеÑÑÐµÐ¹Ñ Ðиван и Ñак далее. Ðалее Ð²Ñ ÑоздаÑÑе абÑÑÑакÑнÑÑ ÑабÑÐ¸ÐºÑ â обÑий инÑеÑÑейÑ, коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ Ð¼ÐµÑÐ¾Ð´Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²ÑÐµÑ Ð¿ÑодÑкÑов ÑемейÑÑва (напÑимеÑ, ÑоздаÑÑÐÑеÑло, ÑоздаÑÑÐиван и ÑоздаÑÑСÑолик). ÐÑи опеÑаÑии Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ð°Ð±ÑÑÑакÑнÑе ÑÐ¸Ð¿Ñ Ð¿ÑодÑкÑов, пÑедÑÑавленнÑе инÑеÑÑейÑами, коÑоÑÑе Ð¼Ñ Ð²Ñделили Ñанее â ÐÑеÑла, ÐÐ¸Ð²Ð°Ð½Ñ Ð¸ СÑолики. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ваÑиаÑии ÑемейÑÑва пÑодÑкÑов Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑоздаÑÑ ÑÐ²Ð¾Ñ ÑобÑÑвеннÑÑ ÑабÑикÑ, Ñеализовав абÑÑÑакÑнÑй инÑеÑÑейÑ. ФабÑики ÑоздаÑÑ Ð¿ÑодÑкÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ваÑиаÑии. ÐапÑимеÑ, ФабÑикаÐодеÑн бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ ÑолÑко ÐÑеÑлаÐодеÑн,ÐиванÑÐодеÑн и СÑоликиÐодеÑн. ÐлиенÑÑкий код должен ÑабоÑаÑÑ ÐºÐ°Ðº Ñ ÑабÑиками, Ñак и Ñ Ð¿ÑодÑкÑами ÑолÑко ÑеÑез Ð¸Ñ Ð¾Ð±Ñие инÑеÑÑейÑÑ. ÐÑо Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ð¿Ð¾Ð´Ð°Ð²Ð°ÑÑ Ð² ваÑи клаÑÑÑ Ð»Ñбой Ñип ÑабÑики и пÑоизводиÑÑ Ð»ÑбÑе пÑодÑкÑÑ, ниÑего не ломаÑ. ```java // ÐÑÐ¾Ñ Ð¿Ð°ÑÑеÑн пÑедполагаеÑ, ÑÑо Ñ Ð²Ð°Ñ ÐµÑÑÑ Ð½ÐµÑколÑко ÑемейÑÑв // пÑодÑкÑов, Ð½Ð°Ñ Ð¾Ð´ÑÑÐ¸Ñ ÑÑ Ð² оÑделÑнÑÑ Ð¸ÐµÑаÑÑ Ð¸ÑÑ ÐºÐ»Ð°ÑÑов // (Button/Checkbox). ÐÑодÑкÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑемейÑÑва Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ // обÑий инÑеÑÑейÑ. interface Button is method paint() // СемейÑÑва пÑодÑкÑов имеÑÑ Ñе же ваÑиаÑии (macOS/Windows). class WinButton implements Button is method paint() is // ÐÑÑиÑоваÑÑ ÐºÐ½Ð¾Ð¿ÐºÑ Ð² ÑÑиле Windows. class MacButton implements Button is method paint() is // ÐÑÑиÑоваÑÑ ÐºÐ½Ð¾Ð¿ÐºÑ Ð² ÑÑиле macOS. interface Checkbox is method paint() class WinCheckbox implements Checkbox is method paint() is // ÐÑÑиÑоваÑÑ ÑÐµÐºÐ±Ð¾ÐºÑ Ð² ÑÑиле Windows. class MacCheckbox implements Checkbox is method paint() is // ÐÑÑиÑоваÑÑ ÑÐµÐºÐ±Ð¾ÐºÑ Ð² ÑÑиле macOS. // ÐбÑÑÑакÑÐ½Ð°Ñ ÑабÑика Ð·Ð½Ð°ÐµÑ Ð¾Ð±Ð¾ вÑÐµÑ Ð°Ð±ÑÑÑакÑнÑÑ ÑÐ¸Ð¿Ð°Ñ // пÑодÑкÑов. interface GUIFactory is method createButton():Button method createCheckbox():Checkbox // ÐÐ°Ð¶Ð´Ð°Ñ ÐºÐ¾Ð½ÐºÑеÑÐ½Ð°Ñ ÑабÑика Ð·Ð½Ð°ÐµÑ Ð¸ ÑоздаÑÑ ÑолÑко пÑодÑкÑÑ // Ñвоей ваÑиаÑии. class WinFactory implements GUIFactory is method createButton():Button is return new WinButton() method createCheckbox():Checkbox is return new WinCheckbox() // ÐеÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо ÑабÑики опеÑиÑÑÑÑ ÐºÐ¾Ð½ÐºÑеÑнÑми клаÑÑами, // Ð¸Ñ Ð¼ÐµÑÐ¾Ð´Ñ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ð°Ð±ÑÑÑакÑнÑе ÑÐ¸Ð¿Ñ Ð¿ÑодÑкÑов. ÐлагодаÑÑ // ÑÑÐ¾Ð¼Ñ ÑабÑики можно взаимозаменÑÑÑ, не изменÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑкий // код. class MacFactory implements GUIFactory is method createButton():Button is return new MacButton() method createCheckbox():Checkbox is return new MacCheckbox() // ÐÐ»Ñ ÐºÐ¾Ð´Ð°, иÑполÑзÑÑÑего ÑабÑикÑ, не важно, Ñ ÐºÐ°ÐºÐ¾Ð¹ конкÑеÑно // ÑабÑикой он ÑабоÑаеÑ. ÐÑе полÑÑаÑели пÑодÑкÑов ÑабоÑаÑÑ Ñ // ними ÑеÑез обÑие инÑеÑÑейÑÑ. class Application is private field factory: GUIFactory private field button: Button constructor Application(factory: GUIFactory) is this.factory = factory method createUI() this.button = factory.createButton() method paint() button.paint() // ÐÑиложение вÑбиÑÐ°ÐµÑ Ñип конкÑеÑной ÑабÑики и ÑоздаÑÑ ÐµÑ // динамиÑеÑки, иÑÑ Ð¾Ð´Ñ Ð¸Ð· конÑигÑÑаÑии или окÑÑжениÑ. class ApplicationConfigurator is method main() is config = readApplicationConfigFile() if (config.OS == "Windows") then factory = new WinFactory() else if (config.OS == "Mac") then factory = new MacFactory() else throw new Exception("Error! Unknown operating system.") Application app = new Application(factory) ``` __ÐÑименимоÑÑÑ__ Ðогда бизнеÑ-логика пÑогÑÐ°Ð¼Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑабоÑаÑÑ Ñ ÑазнÑми видами ÑвÑзаннÑÑ Ð´ÑÑг Ñ Ð´ÑÑгом пÑодÑкÑов, не завиÑÑ Ð¾Ñ ÐºÐ¾Ð½ÐºÑеÑнÑÑ ÐºÐ»Ð°ÑÑов пÑодÑкÑов. ÐбÑÑÑакÑÐ½Ð°Ñ ÑабÑика ÑкÑÑÐ²Ð°ÐµÑ Ð¾Ñ ÐºÐ»Ð¸ÐµÐ½ÑÑкого кода подÑобноÑÑи Ñого, как и какие конкÑеÑно обÑекÑÑ Ð±ÑдÑÑ ÑозданÑ. Ðо пÑи ÑÑом клиенÑÑкий код Ð¼Ð¾Ð¶ÐµÑ ÑабоÑаÑÑ Ñо вÑеми Ñипами ÑоздаваемÑÑ Ð¿ÑодÑкÑов, поÑколÑÐºÑ Ð¸Ñ Ð¾Ð±Ñий инÑеÑÑÐµÐ¹Ñ Ð±Ñл заÑанее опÑеделÑн. Ðогда в пÑогÑамме Ñже иÑполÑзÑеÑÑÑ Ð¤Ð°Ð±ÑиÑнÑй меÑод, но оÑеÑеднÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿ÑедполагаÑÑ Ð²Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ новÑÑ Ñипов пÑодÑкÑов. Ð Ñ Ð¾ÑоÑей пÑогÑамме каждÑй клаÑÑ Ð¾ÑвеÑÐ°ÐµÑ ÑолÑко за Ð¾Ð´Ð½Ñ Ð²ÐµÑÑ. ÐÑли клаÑÑ Ð¸Ð¼ÐµÐµÑ ÑлиÑком много ÑабÑиÑнÑÑ Ð¼ÐµÑодов, они ÑпоÑÐ¾Ð±Ð½Ñ Ð·Ð°ÑÑманиÑÑ ÐµÐ³Ð¾ оÑновнÑÑ ÑÑнкÑиÑ. ÐоÑÑÐ¾Ð¼Ñ Ð¸Ð¼ÐµÐµÑ ÑмÑÑл вÑнеÑÑи вÑÑ Ð»Ð¾Ð³Ð¸ÐºÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿ÑодÑкÑов в оÑделÑнÑÑ Ð¸ÐµÑаÑÑ Ð¸Ñ ÐºÐ»Ð°ÑÑов, пÑименив абÑÑÑакÑнÑÑ ÑабÑикÑ. __Шаги ÑеализаÑии__ + СоздайÑе ÑаблиÑÑ ÑооÑноÑений Ñипов пÑодÑкÑов к ваÑиаÑиÑм ÑемейÑÑв пÑодÑкÑов. + СведиÑе вÑе ваÑиаÑии пÑодÑкÑов к обÑим инÑеÑÑейÑам. + ÐпÑеделиÑе инÑеÑÑÐµÐ¹Ñ Ð°Ð±ÑÑÑакÑной ÑабÑики. Ðн должен имеÑÑ ÑабÑиÑнÑе меÑÐ¾Ð´Ñ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ из Ñипов пÑодÑкÑов. + СоздайÑе клаÑÑÑ ÐºÐ¾Ð½ÐºÑеÑнÑÑ ÑабÑик, Ñеализовав инÑеÑÑÐµÐ¹Ñ Ð°Ð±ÑÑÑакÑной ÑабÑики. ÐÑÐ¸Ñ ÐºÐ»Ð°ÑÑов должно бÑÑÑ ÑÑолÑко же, ÑколÑко и ваÑиаÑий ÑемейÑÑв пÑодÑкÑов. + ÐзмениÑе код иниÑиализаÑии пÑогÑÐ°Ð¼Ð¼Ñ Ñак, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð° Ñоздавала опÑеделÑннÑÑ ÑабÑÐ¸ÐºÑ Ð¸ пеÑедавала ÐµÑ Ð² клиенÑÑкий код. + ÐамениÑе в клиенÑÑком коде ÑÑаÑÑки ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿ÑодÑкÑов ÑеÑез конÑÑÑÑкÑÐ¾Ñ Ð²Ñзовами ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ Ð¼ÐµÑодов ÑабÑики. __ÐÑеимÑÑеÑÑва и недоÑÑаÑки__ + ÐаÑанÑиÑÑÐµÑ ÑоÑеÑаемоÑÑÑ ÑоздаваемÑÑ Ð¿ÑодÑкÑов. + ÐзбавлÑÐµÑ ÐºÐ»Ð¸ÐµÐ½ÑÑкий код Ð¾Ñ Ð¿ÑивÑзки к конкÑеÑнÑм клаÑÑам пÑодÑкÑов. + ÐÑделÑÐµÑ ÐºÐ¾Ð´ пÑоизводÑÑва пÑодÑкÑов в одно меÑÑо, ÑпÑоÑÐ°Ñ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ ÐºÐ¾Ð´Ð°. + УпÑоÑÐ°ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ новÑÑ Ð¿ÑодÑкÑов в пÑогÑаммÑ. + РеализÑÐµÑ Ð¿ÑинÑип оÑкÑÑÑоÑÑи/закÑÑÑоÑÑи. + - УÑложнÑÐµÑ ÐºÐ¾Ð´ пÑогÑÐ°Ð¼Ð¼Ñ Ð¸Ð·-за Ð²Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑва дополниÑелÑнÑÑ ÐºÐ»Ð°ÑÑов. + - ТÑебÑÐµÑ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ Ð²ÑÐµÑ Ñипов пÑодÑкÑов в каждой ваÑиаÑии. ## СÑÑоиÑÐµÐ»Ñ Builder ÐÑедÑÑавÑÑе ÑложнÑй обÑекÑ, ÑÑебÑÑÑий кÑопоÑливой поÑаговой иниÑиализаÑии множеÑÑва полей и вложеннÑÑ Ð¾Ð±ÑекÑов. Ðод иниÑиализаÑии ÑÐ°ÐºÐ¸Ñ Ð¾Ð±ÑекÑов обÑÑно ÑпÑÑÑан внÑÑÑи монÑÑÑÑозного конÑÑÑÑкÑоÑа Ñ Ð´ÐµÑÑÑком паÑамеÑÑов. Ðибо еÑÑ Ñ Ñже â ÑаÑпÑлÑн по вÑÐµÐ¼Ñ ÐºÐ»Ð¸ÐµÐ½ÑÑÐºÐ¾Ð¼Ñ ÐºÐ¾Ð´Ñ. ÐапÑимеÑ, давайÑе подÑмаем о Ñом, как ÑоздаÑÑ Ð¾Ð±ÑÐµÐºÑ Ðом. ЧÑÐ¾Ð±Ñ Ð¿Ð¾ÑÑÑоиÑÑ ÑÑандаÑÑнÑй дом, нÑжно поÑÑавиÑÑ 4 ÑÑенÑ, ÑÑÑановиÑÑ Ð´Ð²ÐµÑи, вÑÑавиÑÑ Ð¿Ð°ÑÑ Ð¾ÐºÐ¾Ð½ и положиÑÑ ÐºÑÑÑÑ. Ðо ÑÑо, еÑли Ð²Ñ Ñ Ð¾ÑиÑе дом поболÑÑе да поÑвеÑлее, имеÑÑий Ñад, баÑÑейн и пÑоÑее добÑо? Самое пÑоÑÑое ÑеÑение â ÑаÑÑиÑиÑÑ ÐºÐ»Ð°ÑÑ Ðом, Ñоздав подклаÑÑÑ Ð´Ð»Ñ Ð²ÑÐµÑ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñий паÑамеÑÑов дома. ÐÑоблема Ñакого Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð° â ÑÑо гÑомадное колиÑеÑÑво клаÑÑов, коÑоÑÑе вам пÑидÑÑÑÑ ÑоздаÑÑ. ÐаждÑй новÑй паÑамеÑÑ, вÑоде ÑвеÑа обоев или маÑеÑиала кÑовли, заÑÑÐ°Ð²Ð¸Ñ Ð²Ð°Ñ ÑоздаваÑÑ Ð²ÑÑ Ð±Ð¾Ð»ÑÑе и болÑÑе клаÑÑов Ð´Ð»Ñ Ð¿ÐµÑеÑиÑÐ»ÐµÐ½Ð¸Ñ Ð²ÑÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½ÑÑ Ð²Ð°ÑианÑов. ЧÑÐ¾Ð±Ñ Ð½Ðµ плодиÑÑ Ð¿Ð¾Ð´ÐºÐ»Ð°ÑÑÑ, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе подойÑи к ÑеÑÐµÐ½Ð¸Ñ Ñ Ð´ÑÑгой ÑÑоÑонÑ. ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑоздаÑÑ Ð³Ð¸Ð³Ð°Ð½ÑÑкий конÑÑÑÑкÑÐ¾Ñ Ðома, пÑинимаÑÑий ÑÐ¹Ð¼Ñ Ð¿Ð°ÑамеÑÑов Ð´Ð»Ñ ÐºÐ¾Ð½ÑÑÐ¾Ð»Ñ Ð½Ð°Ð´ ÑоздаваемÑм пÑодÑкÑом. ÐейÑÑвиÑелÑно, ÑÑо Ð¸Ð·Ð±Ð°Ð²Ð¸Ñ Ð²Ð°Ñ Ð¾Ñ Ð¿Ð¾Ð´ÐºÐ»Ð°ÑÑов, но пÑиведÑÑ Ðº дÑÑгой пÑоблеме. ÐолÑÑÐ°Ñ ÑаÑÑÑ ÑÑÐ¸Ñ Ð¿Ð°ÑамеÑÑов бÑÐ´ÐµÑ Ð¿ÑоÑÑаиваÑÑ, а вÑÐ·Ð¾Ð²Ñ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа бÑдÑÑ Ð²ÑглÑдеÑÑ Ð¼Ð¾Ð½ÑÑÑÑозно из-за длинного ÑпиÑка паÑамеÑÑов. РпÑимеÑÑ, далеко не каждÑй дом Ð¸Ð¼ÐµÐµÑ Ð±Ð°ÑÑейн, поÑÑÐ¾Ð¼Ñ Ð¿Ð°ÑамеÑÑÑ, ÑвÑзаннÑе Ñ Ð±Ð°ÑÑейнами, бÑдÑÑ Ð¿ÑоÑÑаиваÑÑ Ð±ÐµÑполезно в 99% ÑлÑÑаев. __РеÑение__ ÐаÑÑеÑн СÑÑоиÑÐµÐ»Ñ Ð¿ÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ Ð²ÑнеÑÑи конÑÑÑÑиÑование обÑекÑа за пÑÐµÐ´ÐµÐ»Ñ ÐµÐ³Ð¾ ÑобÑÑвенного клаÑÑа, поÑÑÑив ÑÑо дело оÑделÑнÑм обÑекÑам, назÑваемÑм ÑÑÑоиÑелÑми. ÐаÑÑеÑн пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ ÑазбиÑÑ Ð¿ÑоÑеÑÑ ÐºÐ¾Ð½ÑÑÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑа на оÑделÑнÑе Ñаги (напÑимеÑ, поÑÑÑоиÑÑСÑенÑ, вÑÑавиÑÑÐвеÑи и дÑÑгие). ЧÑÐ¾Ð±Ñ ÑоздаÑÑ Ð¾Ð±ÑекÑ, вам нÑжно пооÑеÑÑдно вÑзÑваÑÑ Ð¼ÐµÑÐ¾Ð´Ñ ÑÑÑоиÑелÑ. ÐÑиÑÑм не нÑжно запÑÑкаÑÑ Ð²Ñе Ñаги, а ÑолÑко Ñе, ÑÑо нÑÐ¶Ð½Ñ Ð´Ð»Ñ Ð¿ÑоизводÑÑва обÑекÑа опÑеделÑнной конÑигÑÑаÑии. ÐÑ Ð¼Ð¾Ð¶ÐµÑе пойÑи далÑÑе и вÑделиÑÑ Ð²ÑÐ·Ð¾Ð²Ñ Ð¼ÐµÑодов ÑÑÑоиÑÐµÐ»Ñ Ð² оÑделÑнÑй клаÑÑ, назÑваемÑй _диÑекÑоÑом_. Ð ÑÑом ÑлÑÑае диÑекÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑ Ð¿Ð¾ÑÑдок Ñагов ÑÑÑоиÑелÑÑÑва, а ÑÑÑоиÑÐµÐ»Ñ â вÑполнÑÑÑ Ð¸Ñ . ```java // СÑÑоиÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ ÑоздаваÑÑ ÑазлиÑнÑе пÑодÑкÑÑ, иÑполÑзÑÑ Ð¾Ð´Ð¸Ð½ // и ÑÐ¾Ñ Ð¶Ðµ пÑоÑеÑÑ ÑÑÑоиÑелÑÑÑва. class Car is // ÐвÑомобили могÑÑ Ð¾ÑлиÑаÑÑÑÑ ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑаÑией: Ñипом // двигаÑелÑ, колиÑеÑÑвом Ñидений, могÑÑ Ð¸Ð¼ÐµÑÑ Ð¸Ð»Ð¸ не имеÑÑ // GPS и ÑиÑÑÐµÐ¼Ñ Ð½Ð°Ð²Ð¸Ð³Ð°Ñии и Ñ. д. ÐÑоме Ñого, авÑомобили // могÑÑ Ð±ÑÑÑ Ð³Ð¾ÑодÑкими, ÑпоÑÑивнÑми или внедоÑожниками. class Manual is // Ð ÑководÑÑво полÑзоваÑÐµÐ»Ñ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ конÑигÑÑаÑии // авÑомобилÑ. // ÐнÑеÑÑÐµÐ¹Ñ ÑÑÑоиÑÐµÐ»Ñ Ð¾Ð±ÑÑвлÑÐµÑ Ð²Ñе возможнÑе ÑÑÐ°Ð¿Ñ Ð¸ Ñаги // конÑигÑÑаÑии пÑодÑкÑа. interface Builder is method reset() method setSeats(...) method setEngine(...) method setTripComputer(...) method setGPS(...) // ÐÑе конкÑеÑнÑе ÑÑÑоиÑели ÑеализÑÑÑ Ð¾Ð±Ñий инÑеÑÑÐµÐ¹Ñ Ð¿Ð¾-ÑвоемÑ. class CarBuilder implements Builder is private field car:Car method reset() // ÐомеÑÑиÑÑ Ð½Ð¾Ð²Ñй обÑÐµÐºÑ Car в поле "car". method setSeats(...) is // УÑÑановиÑÑ Ñказанное колиÑеÑÑво Ñидений. method setEngine(...) is // УÑÑановиÑÑ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñй двигаÑелÑ. method setTripComputer(...) is // УÑÑановиÑÑ Ð¿Ð¾Ð´Ð°Ð½Ð½ÑÑ ÑиÑÑÐµÐ¼Ñ Ð½Ð°Ð²Ð¸Ð³Ð°Ñии. method setGPS(...) is // УÑÑановиÑÑ Ð¸Ð»Ð¸ ÑнÑÑÑ GPS. method getResult():Car is // ÐеÑнÑÑÑ ÑекÑÑий обÑÐµÐºÑ Ð°Ð²ÑомобилÑ. // РоÑлиÑие Ð¾Ñ Ð´ÑÑÐ³Ð¸Ñ Ð¿Ð¾ÑождаÑÑÐ¸Ñ Ð¿Ð°ÑÑеÑнов, где пÑодÑкÑÑ // Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑаÑÑÑÑ Ð¾Ð´Ð½Ð¾Ð¹ иеÑаÑÑ Ð¸Ð¸ клаÑÑов или ÑледоваÑÑ // обÑÐµÐ¼Ñ Ð¸Ð½ÑеÑÑейÑÑ, ÑÑÑоиÑели могÑÑ ÑоздаваÑÑ ÑовеÑÑенно // ÑазнÑе пÑодÑкÑÑ, коÑоÑÑе не имеÑÑ Ð¾Ð±Ñего пÑедка. class CarManualBuilder implements Builder is private field manual:Manual method reset() // ÐомеÑÑиÑÑ Ð½Ð¾Ð²Ñй обÑÐµÐºÑ Manual в поле "manual". method setSeats(...) is // ÐпиÑаÑÑ, ÑколÑко меÑÑ Ð² маÑине. method setEngine(...) is // ÐобавиÑÑ Ð² ÑÑководÑÑво опиÑание двигаÑелÑ. method setTripComputer(...) is // ÐобавиÑÑ Ð² ÑÑководÑÑво опиÑание ÑиÑÑÐµÐ¼Ñ Ð½Ð°Ð²Ð¸Ð³Ð°Ñии. method setGPS(...) is // ÐобавиÑÑ Ð² инÑÑÑÑкÑÐ¸Ñ Ð¸Ð½ÑÑÑÑкÑÐ¸Ñ GPS. method getResult():Manual is // ÐеÑнÑÑÑ ÑекÑÑий обÑÐµÐºÑ ÑÑководÑÑва. // ÐиÑекÑÐ¾Ñ Ð·Ð½Ð°ÐµÑ, в какой поÑледоваÑелÑноÑÑи нÑжно заÑÑавлÑÑÑ // ÑабоÑаÑÑ ÑÑÑоиÑелÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑÑ Ð¸Ð»Ð¸ инÑÑ Ð²ÐµÑÑÐ¸Ñ // пÑодÑкÑа. ÐамеÑÑÑе, ÑÑо диÑекÑÐ¾Ñ ÑабоÑÐ°ÐµÑ Ñо ÑÑÑоиÑелем ÑеÑез // обÑий инÑеÑÑейÑ, благодаÑÑ ÑÐµÐ¼Ñ Ð¾Ð½ не Ð·Ð½Ð°ÐµÑ Ñип пÑодÑкÑа, // коÑоÑÑй изгоÑовлÑÐµÑ ÑÑÑоиÑелÑ. class Director is method constructSportsCar(builder: Builder) is builder.reset() builder.setSeats(2) builder.setEngine(new SportEngine()) builder.setTripComputer(true) builder.setGPS(true) // ÐиÑекÑÐ¾Ñ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ Ð¾Ð±ÑÐµÐºÑ ÐºÐ¾Ð½ÐºÑеÑного ÑÑÑоиÑÐµÐ»Ñ Ð¾Ñ ÐºÐ»Ð¸ÐµÐ½Ñа // (пÑиложениÑ). ÐÑиложение Ñамо знаеÑ, какого ÑÑÑоиÑÐµÐ»Ñ Ð½Ñжно // иÑполÑзоваÑÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¾Ð¿ÑеделÑннÑй пÑодÑкÑ. class Application is method makeCar() is director = new Director() CarBuilder builder = new CarBuilder() director.constructSportsCar(builder) Car car = builder.getResult() CarManualBuilder builder = new CarManualBuilder() director.constructSportsCar(builder) // ÐоÑовÑй пÑодÑÐºÑ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ ÑÑÑоиÑелÑ, Ñак как // диÑекÑÐ¾Ñ ÑаÑе вÑего не Ð·Ð½Ð°ÐµÑ Ð¸ не завиÑÐ¸Ñ Ð¾Ñ // конкÑеÑнÑÑ ÐºÐ»Ð°ÑÑов ÑÑÑоиÑелей и пÑодÑкÑов. Manual manual = builder.getResult() ``` __ÐблаÑÑÑ Ð¿ÑименениÑ__ Ðогда Ð²Ñ Ñ Ð¾ÑиÑе избавиÑÑÑÑ Ð¾Ñ Â«ÑелеÑкопиÑеÑкого конÑÑÑÑкÑоÑа». ÐопÑÑÑим, Ñ Ð²Ð°Ñ ÐµÑÑÑ Ð¾Ð´Ð¸Ð½ конÑÑÑÑкÑÐ¾Ñ Ñ Ð´ÐµÑÑÑÑÑ Ð¾Ð¿ÑионалÑнÑми паÑамеÑÑами. Ðго неÑдобно вÑзÑваÑÑ, поÑÑÐ¾Ð¼Ñ Ð²Ñ Ñоздали еÑÑ Ð´ÐµÑÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑов Ñ Ð¼ÐµÐ½ÑÑим колиÑеÑÑвом паÑамеÑÑов. ÐÑÑ, ÑÑо они делаÑÑ â ÑÑо пеÑеадÑеÑÑÑÑ Ð²Ñзов к Ð±Ð°Ð·Ð¾Ð²Ð¾Ð¼Ñ ÐºÐ¾Ð½ÑÑÑÑкÑоÑÑ, Ð¿Ð¾Ð´Ð°Ð²Ð°Ñ ÐºÐ°ÐºÐ¸Ðµ-Ñо знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð² паÑамеÑÑÑ, коÑоÑÑе пÑопÑÑÐµÐ½Ñ Ð² Ð½Ð¸Ñ ÑÐ°Ð¼Ð¸Ñ . Ðогда Ð²Ð°Ñ ÐºÐ¾Ð´ должен ÑоздаваÑÑ ÑазнÑе пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ°ÐºÐ¾Ð³Ð¾-Ñо обÑекÑа. ÐапÑимеÑ, деÑевÑннÑе и железобеÑоннÑе дома. СÑÑоиÑÐµÐ»Ñ Ð¼Ð¾Ð¶Ð½Ð¾ пÑимениÑÑ, еÑли Ñоздание неÑколÑÐºÐ¸Ñ Ð¿ÑедÑÑавлений обÑекÑа ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· одинаковÑÑ ÑÑапов, коÑоÑÑе оÑлиÑаÑÑÑÑ Ð² деÑалÑÑ . ÐнÑеÑÑÐµÐ¹Ñ ÑÑÑоиÑелей опÑÐµÐ´ÐµÐ»Ð¸Ñ Ð²Ñе возможнÑе ÑÑÐ°Ð¿Ñ ÐºÐ¾Ð½ÑÑÑÑиÑованиÑ. ÐÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±ÑÐ´ÐµÑ ÑооÑвеÑÑÑвоваÑÑ ÑобÑÑвеннÑй клаÑÑ-ÑÑÑоиÑелÑ. РпоÑÑдок ÑÑапов ÑÑÑоиÑелÑÑÑва бÑÐ´ÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑ ÐºÐ»Ð°ÑÑ-диÑекÑоÑ. Ðогда вам нÑжно ÑобиÑаÑÑ ÑложнÑе ÑоÑÑавнÑе обÑекÑÑ, напÑимеÑ, деÑевÑÑ ÐомпоновÑика. СÑÑоиÑÐµÐ»Ñ ÐºÐ¾Ð½ÑÑÑÑиÑÑÐµÑ Ð¾Ð±ÑекÑÑ Ð¿Ð¾Ñагово, а не за один пÑÐ¾Ñ Ð¾Ð´. Ðолее Ñого, Ñаги ÑÑÑоиÑелÑÑÑва можно вÑполнÑÑÑ ÑекÑÑÑивно. Рбез ÑÑого не поÑÑÑоиÑÑ Ð´ÑевовиднÑÑ ÑÑÑÑкÑÑÑÑ, вÑоде ÐомпоновÑика. ÐамеÑÑÑе, ÑÑо СÑÑоиÑÐµÐ»Ñ Ð½Ðµ позволÑÐµÑ Ð¿Ð¾ÑÑоÑонним обÑекÑам имеÑÑ Ð´Ð¾ÑÑÑп к конÑÑÑÑиÑÑÐµÐ¼Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ, пока ÑÐ¾Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð³Ð¾Ñов. ÐÑо пÑÐµÐ´Ð¾Ñ ÑанÑÐµÑ ÐºÐ»Ð¸ÐµÐ½ÑÑкий код Ð¾Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð½ÐµÐ·Ð°ÐºÐ¾Ð½ÑеннÑÑ Â«Ð±Ð¸ÑÑÑ Â» обÑекÑов. __Шаги ÑеализаÑии__ + УбедиÑеÑÑ Ð² Ñом, ÑÑо Ñоздание ÑазнÑÑ Ð¿ÑедÑÑавлений обÑекÑа можно ÑвеÑÑи к обÑим Ñагам. + ÐпиÑиÑе ÑÑи Ñаги в обÑем инÑеÑÑейÑе ÑÑÑоиÑелей. + ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ из пÑедÑÑавлений обÑекÑа-пÑодÑкÑа ÑоздайÑе по Ð¾Ð´Ð½Ð¾Ð¼Ñ ÐºÐ»Ð°ÑÑÑ-ÑÑÑоиÑÐµÐ»Ñ Ð¸ ÑеализÑйÑе Ð¸Ñ Ð¼ÐµÑÐ¾Ð´Ñ ÑÑÑоиÑелÑÑÑва. + Ðе забÑдÑÑе пÑо меÑод полÑÑÐµÐ½Ð¸Ñ ÑезÑлÑÑаÑа. ÐбÑÑно конкÑеÑнÑе ÑÑÑоиÑели опÑеделÑÑÑ ÑобÑÑвеннÑе меÑÐ¾Ð´Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑезÑлÑÑаÑа ÑÑÑоиÑелÑÑÑва. ÐÑ Ð½Ðµ можеÑе опиÑаÑÑ ÑÑи меÑÐ¾Ð´Ñ Ð² инÑеÑÑейÑе ÑÑÑоиÑелей, поÑколÑÐºÑ Ð¿ÑодÑкÑÑ Ð½Ðµ обÑзаÑелÑно Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ Ð¾Ð±Ñий базовÑй клаÑÑ Ð¸Ð»Ð¸ инÑеÑÑейÑ. Ðо Ð²Ñ Ð²Ñегда ÑможеÑе добавиÑÑ Ð¼ÐµÑод полÑÑÐµÐ½Ð¸Ñ ÑезÑлÑÑаÑа в обÑий инÑеÑÑейÑ, еÑли ваÑи ÑÑÑоиÑели пÑоизводÑÑ Ð¾Ð´Ð½Ð¾ÑоднÑе пÑодÑкÑÑ Ñ Ð¾Ð±Ñим пÑедком. + ÐодÑмайÑе о Ñоздании клаÑÑа диÑекÑоÑа. Ðго меÑÐ¾Ð´Ñ Ð±ÑдÑÑ ÑоздаваÑÑ ÑазлиÑнÑе конÑигÑÑаÑии пÑодÑкÑов, вÑзÑÐ²Ð°Ñ ÑазнÑе Ñаги одного и Ñого же ÑÑÑоиÑелÑ. + ÐлиенÑÑкий код должен бÑÐ´ÐµÑ ÑоздаваÑÑ Ð¸ обÑекÑÑ ÑÑÑоиÑелей, и обÑÐµÐºÑ Ð´Ð¸ÑекÑоÑа. ÐеÑед наÑалом ÑÑÑоиÑелÑÑÑва ÐºÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑвÑзаÑÑ Ð¾Ð¿ÑеделÑнного ÑÑÑоиÑÐµÐ»Ñ Ñ Ð´Ð¸ÑекÑоÑом. ÐÑо можно ÑделаÑÑ Ð»Ð¸Ð±Ð¾ ÑеÑез конÑÑÑÑкÑоÑ, либо ÑеÑез ÑеÑÑеÑ, либо подав ÑÑÑоиÑÐµÐ»Ñ Ð½Ð°Ð¿ÑÑмÑÑ Ð² ÑÑÑоиÑелÑнÑй меÑод диÑекÑоÑа. + РезÑлÑÑÐ°Ñ ÑÑÑоиÑелÑÑÑва можно веÑнÑÑÑ Ð¸Ð· диÑекÑоÑа, но ÑолÑко еÑли меÑод возвÑаÑа пÑодÑкÑа ÑдалоÑÑ Ð¿Ð¾Ð¼ÐµÑÑиÑÑ Ð² обÑий инÑеÑÑÐµÐ¹Ñ ÑÑÑоиÑелей. ÐнаÑе Ð²Ñ Ð¶ÑÑÑко пÑивÑжеÑе диÑекÑоÑа к конкÑеÑнÑм клаÑÑам ÑÑÑоиÑелей. __ÐÑеимÑÑеÑÑва и недоÑÑаÑки__ + ÐозволÑÐµÑ ÑоздаваÑÑ Ð¿ÑодÑкÑÑ Ð¿Ð¾Ñагово. + ÐозволÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð¾Ð´Ð¸Ð½ и ÑÐ¾Ñ Ð¶Ðµ код Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑазлиÑнÑÑ Ð¿ÑодÑкÑов. + ÐзолиÑÑÐµÑ ÑложнÑй код ÑбоÑки пÑодÑкÑа Ð¾Ñ ÐµÐ³Ð¾ оÑновной бизнеÑ-логики. + - УÑложнÑÐµÑ ÐºÐ¾Ð´ пÑогÑÐ°Ð¼Ð¼Ñ Ð¸Ð·-за Ð²Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ ÐºÐ»Ð°ÑÑов. + - ÐÐ»Ð¸ÐµÐ½Ñ Ð±ÑÐ´ÐµÑ Ð¿ÑивÑзан к конкÑеÑнÑм клаÑÑам ÑÑÑоиÑелей, Ñак как в инÑеÑÑейÑе ÑÑÑоиÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ бÑÑÑ Ð¼ÐµÑода полÑÑÐµÐ½Ð¸Ñ ÑезÑлÑÑаÑа. ## ФабÑиÑнÑй меÑод ÐÑедÑÑавÑÑе, ÑÑо Ð²Ñ ÑоздаÑÑе пÑогÑÐ°Ð¼Ð¼Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð³ÑÑзовÑми пеÑевозками. СпеÑва Ð²Ñ ÑаÑÑÑиÑÑваеÑе пеÑевозиÑÑ ÑоваÑÑ ÑолÑко на авÑомобилÑÑ . ÐоÑÑÐ¾Ð¼Ñ Ð²ÐµÑÑ Ð²Ð°Ñ ÐºÐ¾Ð´ ÑабоÑÐ°ÐµÑ Ñ Ð¾Ð±ÑекÑами клаÑÑа ÐÑÑзовик. Ркакой-Ñо Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ð°Ñа пÑогÑамма ÑÑановиÑÑÑ Ð½Ð°ÑÑолÑко извеÑÑной, ÑÑо моÑÑкие пеÑевозÑики вÑÑÑÑаиваÑÑÑÑ Ð² оÑеÑÐµÐ´Ñ Ð¸ пÑоÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ Ð¼Ð¾ÑÑкой логиÑÑики в пÑогÑаммÑ. ÐÑлиÑнÑе новоÑÑи, пÑавда?! Ðо как наÑÑÑÑ ÐºÐ¾Ð´Ð°? ÐолÑÑÐ°Ñ ÑаÑÑÑ ÑÑÑеÑÑвÑÑÑего кода жÑÑÑко пÑивÑзана к клаÑÑам ÐÑÑзовиков. ЧÑÐ¾Ð±Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð² пÑогÑÐ°Ð¼Ð¼Ñ ÐºÐ»Ð°ÑÑÑ Ð¼Ð¾ÑÑÐºÐ¸Ñ Ð¡Ñдов, понадобиÑÑÑ Ð¿ÐµÑелопаÑиÑÑ Ð²ÑÑ Ð¿ÑогÑаммÑ. Ðолее Ñого, еÑли Ð²Ñ Ð¿Ð¾Ñом ÑеÑиÑе добавиÑÑ Ð² пÑогÑÐ°Ð¼Ð¼Ñ ÐµÑÑ Ð¾Ð´Ð¸Ð½ вид ÑÑанÑпоÑÑа, Ñо вÑÑ ÑÑÑ ÑабоÑÑ Ð¿ÑидÑÑÑÑ Ð¿Ð¾Ð²ÑоÑиÑÑ. РиÑоге Ð²Ñ Ð¿Ð¾Ð»ÑÑиÑе ÑжаÑаÑÑий код, наполненнÑй ÑÑловнÑми опеÑаÑоÑами, коÑоÑÑе вÑполнÑÑÑ Ñо или иное дейÑÑвие, в завиÑимоÑÑи Ð¾Ñ ÐºÐ»Ð°ÑÑа ÑÑанÑпоÑÑа. __РеÑение__ ÐаÑÑеÑн ФабÑиÑнÑй меÑод пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ ÑоздаваÑÑ Ð¾Ð±ÑекÑÑ Ð½Ðµ напÑÑмÑÑ, иÑполÑзÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ new, а ÑеÑез вÑзов оÑобого ÑабÑиÑного меÑода. Ðе пÑгайÑеÑÑ, обÑекÑÑ Ð²ÑÑ Ñавно бÑдÑÑ ÑоздаваÑÑÑÑ Ð¿Ñи помоÑи new, но делаÑÑ ÑÑо бÑÐ´ÐµÑ ÑабÑиÑнÑй меÑод. Ðа пеÑвÑй взглÑд, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð±ÐµÑÑмÑÑленнÑм: Ð¼Ñ Ð¿ÑоÑÑо пеÑемеÑÑили вÑзов конÑÑÑÑкÑоÑа из одного конÑа пÑогÑÐ°Ð¼Ð¼Ñ Ð² дÑÑгой. Ðо ÑепеÑÑ Ð²Ñ ÑможеÑе пеÑеопÑеделиÑÑ ÑабÑиÑнÑй меÑод в подклаÑÑе, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ñип Ñоздаваемого пÑодÑкÑа. ЧÑÐ¾Ð±Ñ ÑÑа ÑиÑÑема заÑабоÑала, вÑе возвÑаÑаемÑе обÑекÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ Ð¾Ð±Ñий инÑеÑÑейÑ. ÐодклаÑÑÑ ÑмогÑÑ Ð¿ÑоизводиÑÑ Ð¾Ð±ÑекÑÑ ÑазлиÑнÑÑ ÐºÐ»Ð°ÑÑов, ÑледÑÑÑÐ¸Ñ Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¸ ÑÐ¾Ð¼Ñ Ð¶Ðµ инÑеÑÑейÑÑ. ÐапÑимеÑ, клаÑÑÑ ÐÑÑзовик и СÑдно ÑеализÑÑÑ Ð¸Ð½ÑеÑÑÐµÐ¹Ñ Ð¢ÑанÑпоÑÑ Ñ Ð¼ÐµÑодом доÑÑавиÑÑ. ÐаждÑй из ÑÑÐ¸Ñ ÐºÐ»Ð°ÑÑов ÑеализÑÐµÑ Ð¼ÐµÑод по-ÑвоемÑ: гÑÑзовики везÑÑ Ð³ÑÑÐ·Ñ Ð¿Ð¾ земле, а ÑÑда â по моÑÑ. ФабÑиÑнÑй меÑод в клаÑÑе ÐоÑожнойÐогиÑÑики веÑнÑÑ Ð¾Ð±ÑекÑ-гÑÑзовик, а клаÑÑ ÐоÑÑкойÐогиÑÑики â обÑекÑ-ÑÑдно. ÐÐ»Ñ ÐºÐ»Ð¸ÐµÐ½Ñа ÑабÑиÑного меÑода Ð½ÐµÑ ÑазниÑÑ Ð¼ÐµÐ¶Ð´Ñ ÑÑими обÑекÑами, Ñак как он бÑÐ´ÐµÑ ÑÑакÑоваÑÑ Ð¸Ñ ÐºÐ°Ðº некий абÑÑÑакÑнÑй ТÑанÑпоÑÑ. ÐÐ»Ñ Ð½ÐµÐ³Ð¾ бÑÐ´ÐµÑ Ð²Ð°Ð¶Ð½Ð¾, ÑÑÐ¾Ð±Ñ Ð¾Ð±ÑÐµÐºÑ Ð¸Ð¼ÐµÐ» меÑод доÑÑавиÑÑ, а как конкÑеÑно он ÑабоÑÐ°ÐµÑ â не важно. ```java // ÐаÑÑеÑн ФабÑиÑнÑй меÑод пÑименим Ñогда, когда в пÑогÑамме // еÑÑÑ Ð¸ÐµÑаÑÑ Ð¸Ñ ÐºÐ»Ð°ÑÑов пÑодÑкÑов. interface Button is method render() method onClick(f) class WindowsButton implements Button is method render(a, b) is // ÐÑÑиÑоваÑÑ ÐºÐ½Ð¾Ð¿ÐºÑ Ð² ÑÑиле Windows. method onClick(f) is // ÐавеÑиÑÑ Ð½Ð° ÐºÐ½Ð¾Ð¿ÐºÑ Ð¾Ð±ÑабоÑÑик ÑобÑÑий Windows. class HTMLButton implements Button is method render(a, b) is // ÐеÑнÑÑÑ HTML-код кнопки. method onClick(f) is // ÐавеÑиÑÑ Ð½Ð° ÐºÐ½Ð¾Ð¿ÐºÑ Ð¾Ð±ÑабоÑÑик ÑобÑÑÐ¸Ñ Ð±ÑаÑзеÑа. // ÐазовÑй клаÑÑ ÑабÑики. ÐамеÑÑÑе, ÑÑо "ÑабÑика" â ÑÑо вÑего // лиÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑÐ½Ð°Ñ ÑÐ¾Ð»Ñ Ð´Ð»Ñ ÐºÐ»Ð°ÑÑа. СкоÑее вÑего, он Ñже // Ð¸Ð¼ÐµÐµÑ ÐºÐ°ÐºÑÑ-Ñо бизнеÑ-логикÑ, в коÑоÑой ÑÑебÑеÑÑÑ Ñоздание // ÑазнообÑазнÑÑ Ð¿ÑодÑкÑов. class Dialog is method render() is // ЧÑÐ¾Ð±Ñ Ð¸ÑполÑзоваÑÑ ÑабÑиÑнÑй меÑод, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ // ÑбедиÑÑÑÑ Ð² Ñом, ÑÑо ÑÑа бизнеÑ-логика не завиÑÐ¸Ñ Ð¾Ñ // конкÑеÑнÑÑ ÐºÐ»Ð°ÑÑов пÑодÑкÑов. Button â ÑÑо обÑий // инÑеÑÑÐµÐ¹Ñ ÐºÐ½Ð¾Ð¿Ð¾Ðº, поÑÑÐ¾Ð¼Ñ Ð²Ñе Ñ Ð¾ÑоÑо. Button okButton = createButton() okButton.onClick(closeDialog) okButton.render() // ÐÑ Ð²ÑноÑим веÑÑ ÐºÐ¾Ð´ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿ÑодÑкÑов в оÑобÑй меÑод, // коÑоÑÑй назваÑÑ "ÑабÑиÑнÑм". abstract method createButton():Button // ÐонкÑеÑнÑе ÑабÑики пеÑеопÑеделÑÑÑ ÑабÑиÑнÑй меÑод и // возвÑаÑаÑÑ Ð¸Ð· него ÑобÑÑвеннÑе пÑодÑкÑÑ. class WindowsDialog extends Dialog is method createButton():Button is return new WindowsButton() class WebDialog extends Dialog is method createButton():Button is return new HTMLButton() class Application is field dialog: Dialog // ÐÑиложение ÑоздаÑÑ Ð¾Ð¿ÑеделÑннÑÑ ÑабÑÐ¸ÐºÑ Ð² завиÑимоÑÑи Ð¾Ñ // конÑигÑÑаÑии или окÑÑжениÑ. method initialize() is config = readApplicationConfigFile() if (config.OS == "Windows") then dialog = new WindowsDialog() else if (config.OS == "Web") then dialog = new WebDialog() else throw new Exception("Error! Unknown operating system.") // ÐÑли веÑÑ Ð¾ÑÑалÑной клиенÑÑкий код ÑабоÑÐ°ÐµÑ Ñ ÑабÑиками и // пÑодÑкÑами ÑолÑко ÑеÑез обÑий инÑеÑÑейÑ, Ñо Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ // бÑÐ´ÐµÑ Ð½Ðµ важно, ÐºÐ°ÐºÐ°Ñ ÑабÑика бÑла Ñоздана изнаÑалÑно. method main() is this.initialize() dialog.render() ``` __ÐÑименимоÑÑÑ__ Ðогда заÑанее неизвеÑÑÐ½Ñ ÑÐ¸Ð¿Ñ Ð¸ завиÑимоÑÑи обÑекÑов, Ñ ÐºÐ¾ÑоÑÑми должен ÑабоÑаÑÑ Ð²Ð°Ñ ÐºÐ¾Ð´. ФабÑиÑнÑй меÑод оÑделÑÐµÑ ÐºÐ¾Ð´ пÑоизводÑÑва пÑодÑкÑов Ð¾Ñ Ð¾ÑÑалÑного кода, коÑоÑÑй ÑÑи пÑодÑкÑÑ Ð¸ÑполÑзÑеÑ. ÐлагодаÑÑ ÑÑомÑ, код пÑоизводÑÑва можно ÑаÑÑиÑÑÑÑ, не ÑÑÐ¾Ð³Ð°Ñ Ð¾Ñновной. Так, ÑÑÐ¾Ð±Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ Ð½Ð¾Ð²Ð¾Ð³Ð¾ пÑодÑкÑа, вам нÑжно ÑоздаÑÑ Ð½Ð¾Ð²Ñй подклаÑÑ Ð¸ опÑеделиÑÑ Ð² нÑм ÑабÑиÑнÑй меÑод, возвÑаÑÐ°Ñ Ð¾ÑÑÑда ÑкземплÑÑ Ð½Ð¾Ð²Ð¾Ð³Ð¾ пÑодÑкÑа. Ðогда Ð²Ñ Ñ Ð¾ÑиÑе даÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑм ÑаÑÑиÑÑÑÑ ÑаÑÑи ваÑего ÑÑеймвоÑка или библиоÑеки. ÐолÑзоваÑели могÑÑ ÑаÑÑиÑÑÑÑ ÐºÐ»Ð°ÑÑÑ Ð²Ð°Ñего ÑÑеймвоÑка ÑеÑез наÑледование. Ðо как ÑделаÑÑ Ñак, ÑÑÐ¾Ð±Ñ ÑÑеймвоÑк Ñоздавал обÑекÑÑ Ð¸Ð· ÑÑÐ¸Ñ Ð½Ð¾Ð²ÑÑ ÐºÐ»Ð°ÑÑов, а не из ÑÑандаÑÑнÑÑ ? РеÑением бÑÐ´ÐµÑ Ð´Ð°ÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑм возможноÑÑÑ ÑаÑÑиÑÑÑÑ Ð½Ðµ ÑолÑко желаемÑе компоненÑÑ, но и клаÑÑÑ, коÑоÑÑе ÑоздаÑÑ ÑÑи компоненÑÑ. Ð Ð´Ð»Ñ ÑÑого ÑоздаÑÑие клаÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ ÐºÐ¾Ð½ÐºÑеÑнÑе ÑоздаÑÑие меÑодÑ, коÑоÑÑе можно опÑеделиÑÑ. ÐапÑимеÑ, Ð²Ñ Ð¸ÑполÑзÑеÑе гоÑовÑй UI-ÑÑеймвоÑк Ð´Ð»Ñ Ñвоего пÑиложениÑ. Ðо Ð²Ð¾Ñ Ð±ÐµÐ´Ð° â ÑÑебÑеÑÑÑ Ð¸Ð¼ÐµÑÑ ÐºÑÑглÑе кнопки, вмеÑÑо ÑÑандаÑÑнÑÑ Ð¿ÑÑмоÑголÑнÑÑ . ÐÑ ÑоздаÑÑе клаÑÑ RoundButton. Ðо как ÑказаÑÑ Ð³Ð»Ð°Ð²Ð½Ð¾Ð¼Ñ ÐºÐ»Ð°ÑÑÑ ÑÑеймвоÑка UIFramework, ÑÑÐ¾Ð±Ñ Ð¾Ð½ ÑепеÑÑ Ñоздавал кÑÑглÑе кнопки, вмеÑÑо ÑÑандаÑÑнÑÑ ? ÐÐ»Ñ ÑÑого Ð²Ñ ÑоздаÑÑе подклаÑÑ UIWithRoundButtons из базового клаÑÑа ÑÑеймвоÑка, пеÑеопÑеделÑеÑе в нÑм меÑод ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ (а-Ð»Ñ createButton) и впиÑÑваеÑе ÑÑда Ñоздание Ñвоего клаÑÑа кнопок. ÐаÑем иÑполÑзÑеÑе UIWithRoundButtons вмеÑÑо ÑÑандаÑÑного UIFramework. Ðогда Ð²Ñ Ñ Ð¾ÑиÑе ÑкономиÑÑ ÑиÑÑемнÑе ÑеÑÑÑÑÑ, повÑоÑно иÑполÑзÑÑ Ñже ÑозданнÑе обÑекÑÑ, вмеÑÑо поÑÐ¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²ÑÑ . Ð¢Ð°ÐºÐ°Ñ Ð¿Ñоблема обÑÑно Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¿Ñи ÑабоÑе Ñ ÑÑжÑлÑми ÑеÑÑÑÑоÑмкими обÑекÑами, Ñакими, как подклÑÑение к базе даннÑÑ , Ñайловой ÑиÑÑеме и Ñ. д. ÐÑедÑÑавÑÑе, ÑколÑко дейÑÑвий вам нÑжно ÑовеÑÑиÑÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð²ÑоÑно иÑполÑзоваÑÑ ÑÑÑеÑÑвÑÑÑие обÑекÑÑ: + СнаÑала вам ÑледÑÐµÑ ÑоздаÑÑ Ð¾Ð±Ñее Ñ ÑанилиÑе, ÑÑÐ¾Ð±Ñ Ñ ÑаниÑÑ Ð² нÑм вÑе ÑоздаваемÑе обÑекÑÑ. + ÐÑи запÑоÑе нового обÑекÑа нÑжно бÑÐ´ÐµÑ Ð·Ð°Ð³Ð»ÑнÑÑÑ Ð² Ñ ÑанилиÑе и пÑовеÑиÑÑ, еÑÑÑ Ð»Ð¸ Ñам неиÑполÑзÑемÑй обÑекÑ. + РзаÑем веÑнÑÑÑ ÐµÐ³Ð¾ клиенÑÑÐºÐ¾Ð¼Ñ ÐºÐ¾Ð´Ñ. + Ðо еÑли ÑвободнÑÑ Ð¾Ð±ÑекÑов Ð½ÐµÑ â ÑоздаÑÑ Ð½Ð¾Ð²Ñй, не забÑв добавиÑÑ ÐµÐ³Ð¾ в Ñ ÑанилиÑе. ÐеÑÑ ÑÑÐ¾Ñ ÐºÐ¾Ð´ нÑжно кÑда-Ñо помеÑÑиÑÑ, ÑÑÐ¾Ð±Ñ Ð½Ðµ заÑоÑÑÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑкий код. СамÑм ÑдобнÑм меÑÑом бÑл Ð±Ñ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¾Ñ Ð¾Ð±ÑекÑа, Ð²ÐµÐ´Ñ Ð²Ñе ÑÑи пÑовеÑки нÑÐ¶Ð½Ñ ÑолÑко пÑи Ñоздании обÑекÑов. Ðо, ÑвÑ, конÑÑÑÑкÑÐ¾Ñ Ð²Ñегда ÑоздаÑÑ Ð½Ð¾Ð²Ñе обÑекÑÑ, он не Ð¼Ð¾Ð¶ÐµÑ Ð²ÐµÑнÑÑÑ ÑÑÑеÑÑвÑÑÑий ÑкземплÑÑ. ÐнаÑиÑ, нÑжен дÑÑгой меÑод, коÑоÑÑй Ð±Ñ Ð¾Ñдавал как ÑÑÑеÑÑвÑÑÑие, Ñак и новÑе обÑекÑÑ. Ðм и ÑÑÐ°Ð½ÐµÑ ÑабÑиÑнÑй меÑод. __Шаги ÑеализаÑии__ + ÐÑиведиÑе вÑе ÑоздаваемÑе пÑодÑкÑÑ Ðº обÑÐµÐ¼Ñ Ð¸Ð½ÑеÑÑейÑÑ. + РклаÑÑе, коÑоÑÑй пÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ Ð¿ÑодÑкÑÑ, ÑоздайÑе пÑÑÑой ÑабÑиÑнÑй меÑод. РкаÑеÑÑве возвÑаÑаемого Ñипа ÑкажиÑе обÑий инÑеÑÑÐµÐ¹Ñ Ð¿ÑодÑкÑа. + ÐаÑем пÑойдиÑеÑÑ Ð¿Ð¾ ÐºÐ¾Ð´Ñ ÐºÐ»Ð°ÑÑа и найдиÑе вÑе ÑÑаÑÑки, ÑоздаÑÑие пÑодÑкÑÑ. ÐооÑеÑÑдно замениÑе ÑÑи ÑÑаÑÑки вÑзовами ÑабÑиÑного меÑода, пеÑеноÑÑ Ð² него код ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑазлиÑнÑÑ Ð¿ÑодÑкÑов. Ð ÑабÑиÑнÑй меÑод, возможно, пÑидÑÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð½ÐµÑколÑко паÑамеÑÑов, конÑÑолиÑÑÑÑÐ¸Ñ , какой из пÑодÑкÑов нÑжно ÑоздаÑÑ. Ðа ÑÑом ÑÑапе ÑабÑиÑнÑй меÑод, ÑкоÑее вÑего, бÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ ÑдÑÑÑаÑÑе. РнÑм бÑÐ´ÐµÑ Ð¶Ð¸ÑÑ Ð±Ð¾Ð»ÑÑой ÑÑловнÑй опеÑаÑоÑ, вÑбиÑаÑÑий клаÑÑ Ñоздаваемого пÑодÑкÑа. Ðо не волнÑйÑеÑÑ, Ð¼Ñ Ð²Ð¾Ñ-Ð²Ð¾Ñ Ð¸ÑпÑавим ÑÑо. + ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñипа пÑодÑкÑов заведиÑе подклаÑÑ Ð¸ пеÑеопÑеделиÑе в нÑм ÑабÑиÑнÑй меÑод. ÐеÑемеÑÑиÑе ÑÑда код ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑооÑвеÑÑÑвÑÑÑего пÑодÑкÑа из ÑÑпеÑклаÑÑа. + ÐÑли ÑоздаваемÑÑ Ð¿ÑодÑкÑов ÑлиÑком много Ð´Ð»Ñ ÑÑÑеÑÑвÑÑÑÐ¸Ñ Ð¿Ð¾Ð´ÐºÐ»Ð°ÑÑов ÑоздаÑелÑ, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе подÑмаÑÑ Ð¾ введении паÑамеÑÑов в ÑабÑиÑнÑй меÑод, коÑоÑÑе позволÑÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ ÑазлиÑнÑе пÑодÑкÑÑ Ð² пÑÐµÐ´ÐµÐ»Ð°Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ подклаÑÑа. ÐапÑимеÑ, Ñ Ð²Ð°Ñ ÐµÑÑÑ ÐºÐ»Ð°ÑÑ ÐоÑÑа Ñ Ð¿Ð¾Ð´ÐºÐ»Ð°ÑÑами ÐвиаÐоÑÑа и ÐаземнаÑÐоÑÑа, а Ñакже клаÑÑÑ Ð¿ÑодÑкÑов СамолÑÑ, ÐÑÑзовик и Ðоезд. Ðвиа ÑооÑвеÑÑÑвÑÐµÑ Ð¡Ð°Ð¼Ð¾Ð»ÑÑам, но Ð´Ð»Ñ ÐаземнойÐоÑÑÑ ÐµÑÑÑ ÑÑÐ°Ð·Ñ Ð´Ð²Ð° пÑодÑкÑа. ÐÑ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ ÑоздаÑÑ Ð½Ð¾Ð²Ñй подклаÑÑ Ð¿Ð¾ÑÑÑ Ð´Ð»Ñ Ð¿Ð¾ÐµÐ·Ð´Ð¾Ð², но пÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑеÑиÑÑ Ð¸ по-дÑÑгомÑ. ÐлиенÑÑкий код Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑедаваÑÑ Ð² ÑабÑиÑнÑй меÑод ÐаземнойÐоÑÑÑ Ð°ÑгÑменÑ, конÑÑолиÑÑÑÑий Ñип Ñоздаваемого пÑодÑкÑа. + ÐÑли поÑле вÑÐµÑ Ð¿ÐµÑемеÑений ÑабÑиÑнÑй меÑод ÑÑал пÑÑÑÑм, можеÑе ÑделаÑÑ ÐµÐ³Ð¾ абÑÑÑакÑнÑм. ÐÑли в нÑм ÑÑо-Ñо оÑÑалоÑÑ â не беда, ÑÑо бÑÐ´ÐµÑ ÐµÐ³Ð¾ ÑеализаÑией по ÑмолÑаниÑ. __ÐÑеимÑÑеÑÑва и недоÑÑаÑки__ + ÐзбавлÑÐµÑ ÐºÐ»Ð°ÑÑ Ð¾Ñ Ð¿ÑивÑзки к конкÑеÑнÑм клаÑÑам пÑодÑкÑов. + ÐÑделÑÐµÑ ÐºÐ¾Ð´ пÑоизводÑÑва пÑодÑкÑов в одно меÑÑо, ÑпÑоÑÐ°Ñ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ ÐºÐ¾Ð´Ð°. + УпÑоÑÐ°ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ новÑÑ Ð¿ÑодÑкÑов в пÑогÑаммÑ. + РеализÑÐµÑ Ð¿ÑинÑип оÑкÑÑÑоÑÑи/закÑÑÑоÑÑи. + - ÐÐ¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ð¾Ð»ÑÑÐ¸Ñ Ð¿Ð°ÑаллелÑнÑÑ Ð¸ÐµÑаÑÑ Ð¸Ð¹ клаÑÑов, Ñак как Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клаÑÑа пÑодÑкÑа надо ÑоздаÑÑ Ñвой подклаÑÑ ÑоздаÑелÑ. ## ÐÑоÑоÑип Prototype У Ð²Ð°Ñ ÐµÑÑÑ Ð¾Ð±ÑекÑ, коÑоÑÑй нÑжно ÑкопиÑоваÑÑ. Ðак ÑÑо ÑделаÑÑ? ÐÑжно ÑоздаÑÑ Ð¿ÑÑÑой обÑÐµÐºÑ Ñакого же клаÑÑа, а заÑем пооÑеÑÑдно ÑкопиÑоваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð²ÑÐµÑ Ð¿Ð¾Ð»ÐµÐ¹ из ÑÑаÑого обÑекÑа в новÑй. ÐÑекÑаÑно! Ðо еÑÑÑ Ð½ÑанÑ. Ðе каждÑй обÑÐµÐºÑ ÑдаÑÑÑÑ ÑкопиÑоваÑÑ Ñаким обÑазом, Ð²ÐµÐ´Ñ ÑаÑÑÑ ÐµÐ³Ð¾ ÑоÑÑоÑÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑиваÑной, а знаÑÐ¸Ñ â недоÑÑÑпной Ð´Ð»Ñ Ð¾ÑÑалÑного кода пÑогÑаммÑ. Ðо еÑÑÑ Ð¸ дÑÑÐ³Ð°Ñ Ð¿Ñоблема. ÐопиÑÑÑÑий код ÑÑÐ°Ð½ÐµÑ Ð·Ð°Ð²Ð¸Ñим Ð¾Ñ ÐºÐ»Ð°ÑÑов копиÑÑемÑÑ Ð¾Ð±ÑекÑов. ÐедÑ, ÑÑÐ¾Ð±Ñ Ð¿ÐµÑебÑаÑÑ Ð²Ñе Ð¿Ð¾Ð»Ñ Ð¾Ð±ÑекÑа, нÑжно пÑивÑзаÑÑÑÑ Ðº его клаÑÑÑ. Ðз-за ÑÑого Ð²Ñ Ð½Ðµ ÑможеÑе копиÑоваÑÑ Ð¾Ð±ÑекÑÑ, Ð·Ð½Ð°Ñ ÑолÑко Ð¸Ñ Ð¸Ð½ÑеÑÑейÑÑ, а не конкÑеÑнÑе клаÑÑÑ. __РеÑение__ ÐаÑÑеÑн ÐÑоÑоÑип поÑÑÑÐ°ÐµÑ Ñоздание копий Ñамим копиÑÑемÑм обÑекÑам. Ðн Ð²Ð²Ð¾Ð´Ð¸Ñ Ð¾Ð±Ñий инÑеÑÑÐµÐ¹Ñ Ð´Ð»Ñ Ð²ÑÐµÑ Ð¾Ð±ÑекÑов, поддеÑживаÑÑÐ¸Ñ ÐºÐ»Ð¾Ð½Ð¸Ñование. ÐÑо позволÑÐµÑ ÐºÐ¾Ð¿Ð¸ÑоваÑÑ Ð¾Ð±ÑекÑÑ, не пÑивÑзÑваÑÑÑ Ðº Ð¸Ñ ÐºÐ¾Ð½ÐºÑеÑнÑм клаÑÑам. ÐбÑÑно Ñакой инÑеÑÑÐµÐ¹Ñ Ð¸Ð¼ÐµÐµÑ Ð²Ñего один меÑод clone. РеализаÑÐ¸Ñ ÑÑого меÑода в ÑазнÑÑ ÐºÐ»Ð°ÑÑÐ°Ñ Ð¾ÑÐµÐ½Ñ ÑÑ Ð¾Ð¶Ð°. ÐеÑод ÑоздаÑÑ Ð½Ð¾Ð²Ñй обÑÐµÐºÑ ÑекÑÑего клаÑÑа и копиÑÑÐµÑ Ð² него знаÑÐµÐ½Ð¸Ñ Ð²ÑÐµÑ Ð¿Ð¾Ð»ÐµÐ¹ ÑобÑÑвенного обÑекÑа. Так полÑÑиÑÑÑ ÑкопиÑоваÑÑ Ð´Ð°Ð¶Ðµ пÑиваÑнÑе полÑ, Ñак как болÑÑинÑÑво ÑзÑков пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑазÑеÑÐ°ÐµÑ Ð´Ð¾ÑÑÑп к пÑиваÑнÑм полÑм лÑбого обÑекÑа ÑекÑÑего клаÑÑа. ÐбÑекÑ, коÑоÑÑй копиÑÑÑÑ, назÑваеÑÑÑ Ð¿ÑоÑоÑипом (оÑкÑда и название паÑÑеÑна). Ðогда обÑекÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ ÑодеÑÐ¶Ð°Ñ ÑоÑни полей и ÑÑÑÑÑи возможнÑÑ ÐºÐ¾Ð½ÑигÑÑаÑий, пÑоÑоÑÐ¸Ð¿Ñ Ð¼Ð¾Ð³ÑÑ ÑлÑжиÑÑ ÑвоеобÑазной алÑÑеÑнаÑивой ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÐºÐ»Ð°ÑÑов.Ð ÑÑом ÑлÑÑае вÑе возможнÑе пÑоÑоÑÐ¸Ð¿Ñ Ð·Ð°Ð³Ð¾ÑавливаÑÑÑÑ Ð¸ наÑÑÑаиваÑÑÑÑ Ð½Ð° ÑÑапе иниÑиализаÑии пÑогÑаммÑ. ÐоÑом, когда пÑогÑамме нÑжен новÑй обÑекÑ, она ÑоздаÑÑ ÐºÐ¾Ð¿Ð¸Ñ Ð¸Ð· пÑигоÑовленного пÑоÑоÑипа. ```java // ÐазовÑй пÑоÑоÑип. abstract class Shape is field X: int field Y: int field color: string // ÐбÑÑнÑй конÑÑÑÑкÑоÑ. constructor Shape() is // ... // ÐонÑÑÑÑкÑÐ¾Ñ Ð¿ÑоÑоÑипа. constructor Shape(source: Shape) is this() this.X = source.X this.Y = source.Y this.color = source.color // РезÑлÑÑаÑом опеÑаÑии клониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñегда бÑÐ´ÐµÑ Ð¾Ð±ÑÐµÐºÑ Ð¸Ð· // иеÑаÑÑ Ð¸Ð¸ клаÑÑов Shape. abstract method clone():Shape // ÐонкÑеÑнÑй пÑоÑоÑип. ÐеÑод клониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑоздаÑÑ Ð½Ð¾Ð²Ñй обÑÐµÐºÑ // ÑекÑÑего клаÑÑа, пеÑÐµÐ´Ð°Ð²Ð°Ñ Ð² его конÑÑÑÑкÑÐ¾Ñ ÑÑÑÐ»ÐºÑ Ð½Ð° // ÑобÑÑвеннÑй обÑекÑ. ÐлагодаÑÑ ÑÑÐ¾Ð¼Ñ Ð¾Ð¿ÐµÑаÑÐ¸Ñ ÐºÐ»Ð¾Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ // полÑÑаеÑÑÑ Ð°ÑомаÑной â пока не вÑполниÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑ, нового // обÑекÑа еÑÑ Ð½Ðµ ÑÑÑеÑÑвÑеÑ. Ðо как ÑолÑко конÑÑÑÑкÑÐ¾Ñ Ð·Ð°Ð²ÐµÑÑÐ¸Ñ // ÑабоÑÑ, Ð¼Ñ Ð¿Ð¾Ð»ÑÑим полноÑÑÑÑ Ð³Ð¾ÑовÑй обÑекÑ-клон, а не пÑÑÑой // обÑекÑ, коÑоÑÑй нÑжно еÑÑ Ð·Ð°Ð¿Ð¾Ð»Ð½Ð¸ÑÑ. class Rectangle extends Shape is field width: int field height: int constructor Rectangle(source: Rectangle) is // ÐÑзов ÑодиÑелÑÑкого конÑÑÑÑкÑоÑа нÑжен, ÑÑÐ¾Ð±Ñ // ÑкопиÑоваÑÑ Ð¿Ð¾ÑенÑиалÑнÑе пÑиваÑнÑе полÑ, обÑÑвленнÑе // в ÑодиÑелÑÑком клаÑÑе. super(source) this.width = source.width this.height = source.height method clone():Shape is return new Rectangle(this) class Circle extends Shape is field radius: int constructor Circle(source: Circle) is super(source) this.radius = source.radius method clone():Shape is return new Circle(this) // Ðде-Ñо в клиенÑÑком коде. class Application is field shapes: array of Shape constructor Application() is Circle circle = new Circle() circle.X = 10 circle.Y = 10 circle.radius = 20 shapes.add(circle) Circle anotherCircle = circle.clone() shapes.add(anotherCircle) // anotherCircle бÑÐ´ÐµÑ ÑодеÑжаÑÑ ÑоÑнÑÑ ÐºÐ¾Ð¿Ð¸Ñ circle. Rectangle rectangle = new Rectangle() rectangle.width = 10 rectangle.height = 20 shapes.add(rectangle) method businessLogic() is // ÐлÑÑ ÐÑоÑоÑипа в Ñом, ÑÑо Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе клониÑоваÑÑ Ð½Ð°Ð±Ð¾Ñ // обÑекÑов, не Ð·Ð½Ð°Ñ Ð¸Ñ ÐºÐ¾Ð½ÐºÑеÑнÑе клаÑÑÑ. Array shapesCopy = new Array of Shapes. // ÐапÑимеÑ, Ð¼Ñ Ð½Ðµ знаем, какие конкÑеÑно обÑекÑÑ // Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ð²Ð½ÑÑÑи маÑÑива shapes, Ñак как он обÑÑвлен // Ñ Ñипом Shape. Ðо благодаÑÑ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑизмÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ // клониÑоваÑÑ Ð²Ñе обÑекÑÑ Â«Ð²ÑлепÑÑ». ÐÑÐ´ÐµÑ Ð²Ñполнен // меÑод clone Ñого клаÑÑа, коÑоÑÑм ÑвлÑеÑÑÑ ÑÑÐ¾Ñ // обÑекÑ. foreach (s in shapes) do shapesCopy.add(s.clone()) // ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ shapesCopy бÑÐ´ÐµÑ ÑодеÑжаÑÑ ÑоÑнÑе копии // ÑлеменÑов маÑÑива shapes. ``` __ÐÑименимоÑÑÑ__ Ðогда Ð²Ð°Ñ ÐºÐ¾Ð´ не должен завиÑеÑÑ Ð¾Ñ ÐºÐ»Ð°ÑÑов копиÑÑемÑÑ Ð¾Ð±ÑекÑов. Такое ÑаÑÑо бÑваеÑ, еÑли Ð²Ð°Ñ ÐºÐ¾Ð´ ÑабоÑÐ°ÐµÑ Ñ Ð¾Ð±ÑекÑами, поданнÑми извне ÑеÑез какой-Ñо обÑий инÑеÑÑейÑ. ÐÑ Ð½Ðµ можеÑе пÑивÑзаÑÑÑÑ Ðº Ð¸Ñ ÐºÐ»Ð°ÑÑам, даже еÑли Ð±Ñ Ñ Ð¾Ñели, поÑколÑÐºÑ Ð¸Ñ ÐºÐ¾Ð½ÐºÑеÑнÑе клаÑÑÑ Ð½ÐµÐ¸Ð·Ð²ÐµÑÑнÑ. ÐаÑÑеÑн пÑоÑоÑип пÑедоÑÑавлÑÐµÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ Ð¾Ð±Ñий инÑеÑÑÐµÐ¹Ñ Ð´Ð»Ñ ÑабоÑÑ Ñо вÑеми пÑоÑоÑипами. ÐлиенÑÑ Ð½Ðµ нÑжно завиÑеÑÑ Ð¾Ñ Ð²ÑÐµÑ ÐºÐ»Ð°ÑÑов копиÑÑемÑÑ Ð¾Ð±ÑекÑов, а ÑолÑко Ð¾Ñ Ð¸Ð½ÑеÑÑейÑа клониÑованиÑ. Ðогда Ð²Ñ Ð¸Ð¼ÐµÐµÑе ÑÐ¹Ð¼Ñ Ð¿Ð¾Ð´ÐºÐ»Ð°ÑÑов, коÑоÑÑе оÑлиÑаÑÑÑÑ Ð½Ð°ÑалÑнÑми знаÑениÑми полей. ÐÑо-Ñо мог ÑоздаÑÑ Ð²Ñе ÑÑи клаÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¸Ð¼ÐµÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð»ÐµÐ³ÐºÐ¾ поÑождаÑÑ Ð¾Ð±ÑекÑÑ Ñ Ð¾Ð¿ÑеделÑнной конÑигÑÑаÑией. ÐаÑÑеÑн пÑоÑоÑип пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ Ð¸ÑполÑзоваÑÑ Ð½Ð°Ð±Ð¾Ñ Ð¿ÑоÑоÑипов, вмеÑÑо ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÐºÐ»Ð°ÑÑов Ð´Ð»Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð¿ÑлÑÑнÑÑ ÐºÐ¾Ð½ÑигÑÑаÑий обÑекÑов. Таким обÑазом, вмеÑÑо поÑÐ¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑов из подклаÑÑов, Ð²Ñ Ð±ÑдеÑе копиÑоваÑÑ ÑÑÑеÑÑвÑÑÑие обÑекÑÑ-пÑоÑоÑипÑ, в коÑоÑÑÑ Ñже наÑÑÑоено внÑÑÑеннее ÑоÑÑоÑние. ÐÑо Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð²Ð·ÑÑвного ÑоÑÑа колиÑеÑÑва клаÑÑов в пÑогÑамме и ÑменÑÑиÑÑ ÐµÑ ÑложноÑÑÑ. __Шаги ÑеализаÑии__ + СоздайÑе инÑеÑÑÐµÐ¹Ñ Ð¿ÑоÑоÑипов Ñ ÐµÐ´Ð¸Ð½ÑÑвеннÑм меÑодом clone. ÐÑли Ñ Ð²Ð°Ñ Ñже еÑÑÑ Ð¸ÐµÑаÑÑ Ð¸Ñ Ð¿ÑодÑкÑов, меÑод клониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ обÑÑвиÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно в каждом из ÐµÑ ÐºÐ»Ð°ÑÑов. + ÐобавÑÑе в клаÑÑÑ Ð±ÑдÑÑÐ¸Ñ Ð¿ÑоÑоÑипов алÑÑеÑнаÑивнÑй конÑÑÑÑкÑоÑ, пÑинимаÑÑий в каÑеÑÑве аÑгÑменÑа обÑÐµÐºÑ ÑекÑÑего клаÑÑа. ÐÑÐ¾Ñ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¾Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑкопиÑоваÑÑ Ð¸Ð· поданного обÑекÑа знаÑÐµÐ½Ð¸Ñ Ð²ÑÐµÑ Ð¿Ð¾Ð»ÐµÐ¹, обÑÑвленнÑÑ Ð² ÑÐ°Ð¼ÐºÐ°Ñ ÑекÑÑего клаÑÑа, а заÑем пеÑедаÑÑ Ð²Ñполнение ÑодиÑелÑÑÐºÐ¾Ð¼Ñ ÐºÐ¾Ð½ÑÑÑÑкÑоÑÑ, ÑÑÐ¾Ð±Ñ ÑÐ¾Ñ Ð¿Ð¾Ð·Ð°Ð±Ð¾ÑилÑÑ Ð¾ полÑÑ , обÑÑвленнÑÑ Ð² ÑÑпеÑклаÑÑе. ÐÑли Ð²Ð°Ñ ÑзÑк пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿ÐµÑегÑÑÐ·ÐºÑ Ð¼ÐµÑодов, Ñо вам не ÑдаÑÑÑÑ ÑоздаÑÑ Ð½ÐµÑколÑко веÑÑий конÑÑÑÑкÑоÑа. Ð ÑÑом ÑлÑÑае копиÑование знаÑений можно пÑоводиÑÑ Ð¸ в дÑÑгом меÑоде, ÑпеÑиалÑно Ñозданном Ð´Ð»Ñ ÑÑÐ¸Ñ Ñелей. ÐонÑÑÑÑкÑÐ¾Ñ Ñдобнее Ñем, ÑÑо позволÑÐµÑ ÐºÐ»Ð¾Ð½Ð¸ÑоваÑÑ Ð¾Ð±ÑÐµÐºÑ Ð·Ð° один вÑзов. + ÐеÑод клониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÑно ÑоÑÑÐ¾Ð¸Ñ Ð²Ñего из одной ÑÑÑоки: вÑзова опеÑаÑоÑа new Ñ ÐºÐ¾Ð½ÑÑÑÑкÑоÑом пÑоÑоÑипа. ÐÑе клаÑÑÑ, поддеÑживаÑÑие клониÑование, Ð´Ð¾Ð»Ð¶Ð½Ñ Ñвно опÑеделиÑÑ Ð¼ÐµÑод clone, ÑÑÐ¾Ð±Ñ Ð¸ÑполÑзоваÑÑ ÑобÑÑвеннÑй клаÑÑ Ñ Ð¾Ð¿ÐµÑаÑоÑом new. РобÑаÑном ÑлÑÑае ÑезÑлÑÑаÑом клониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÑÐ°Ð½ÐµÑ Ð¾Ð±ÑÐµÐºÑ ÑодиÑелÑÑкого клаÑÑа. + ÐпÑионалÑно, ÑоздайÑе ÑенÑÑалÑное Ñ ÑанилиÑе пÑоÑоÑипов. РнÑм Ñдобно Ñ ÑаниÑÑ Ð²Ð°ÑиаÑии обÑекÑов, возможно, даже одного клаÑÑа, но по-ÑÐ°Ð·Ð½Ð¾Ð¼Ñ Ð½Ð°ÑÑÑоеннÑÑ . ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑазмеÑÑиÑÑ ÑÑо Ñ ÑанилиÑе либо в новом ÑабÑиÑном клаÑÑе, либо в ÑабÑиÑном меÑоде базового клаÑÑа пÑоÑоÑипов. Такой ÑабÑиÑнÑй меÑод должен на оÑновании Ð²Ñ Ð¾Ð´ÑÑÐ¸Ñ Ð°ÑгÑменÑов иÑкаÑÑ Ð² Ñ ÑанилиÑе пÑоÑоÑипов Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑий ÑкземплÑÑ, а заÑем вÑзÑваÑÑ ÐµÐ³Ð¾ меÑод клониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ возвÑаÑаÑÑ Ð¿Ð¾Ð»ÑÑеннÑй обÑекÑ. ÐаконеÑ, нÑжно избавиÑÑÑÑ Ð¾Ñ Ð¿ÑÑмÑÑ Ð²Ñзовов конÑÑÑÑкÑоÑов обÑекÑов, заменив Ð¸Ñ Ð²Ñзовами ÑабÑиÑного меÑода Ñ ÑанилиÑа пÑоÑоÑипов. __ÐÑеимÑÑеÑÑва и недоÑÑаÑки__ + ÐозволÑÐµÑ ÐºÐ»Ð¾Ð½Ð¸ÑоваÑÑ Ð¾Ð±ÑекÑÑ, не пÑивÑзÑваÑÑÑ Ðº Ð¸Ñ ÐºÐ¾Ð½ÐºÑеÑнÑм клаÑÑам. + ÐенÑÑе повÑоÑÑÑÑегоÑÑ ÐºÐ¾Ð´Ð° иниÑиализаÑии обÑекÑов. + УÑкоÑÑÐµÑ Ñоздание обÑекÑов. + ÐлÑÑеÑнаÑива ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÐºÐ»Ð°ÑÑов Ð´Ð»Ñ ÐºÐ¾Ð½ÑÑÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑложнÑÑ Ð¾Ð±ÑекÑов. + - Сложно клониÑоваÑÑ ÑоÑÑавнÑе обÑекÑÑ, имеÑÑие ÑÑÑлки на дÑÑгие обÑекÑÑ. ## СинглÑон Singleton ÐдиноÑка ÑеÑÐ°ÐµÑ ÑÑÐ°Ð·Ñ Ð´Ð²Ðµ пÑоблемÑ, наÑÑÑÐ°Ñ Ð¿ÑинÑип единÑÑвенной оÑвеÑÑÑвенноÑÑи клаÑÑа. ÐаÑанÑиÑÑÐµÑ Ð½Ð°Ð»Ð¸Ñие единÑÑвенного ÑкземплÑÑа клаÑÑа. ЧаÑе вÑего ÑÑо полезно Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к какомÑ-Ñо обÑÐµÐ¼Ñ ÑеÑÑÑÑÑ, напÑимеÑ, базе даннÑÑ . ÐÑедÑÑавÑÑе, ÑÑо Ð²Ñ Ñоздали обÑекÑ, а ÑеÑез некоÑоÑое вÑÐµÐ¼Ñ Ð¿ÑобÑеÑе ÑоздаÑÑ ÐµÑÑ Ð¾Ð´Ð¸Ð½. Ð ÑÑом ÑлÑÑае Ñ Ð¾ÑелоÑÑ Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑÑаÑÑй обÑекÑ, вмеÑÑо ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾. Такое поведение невозможно ÑеализоваÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð±ÑÑного конÑÑÑÑкÑоÑа, Ñак как конÑÑÑÑкÑÐ¾Ñ ÐºÐ»Ð°ÑÑа вÑегда возвÑаÑÐ°ÐµÑ Ð½Ð¾Ð²Ñй обÑекÑ. ÐÑедоÑÑавлÑÐµÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑÑ ÑоÑÐºÑ Ð´Ð¾ÑÑÑпа. ÐÑо не пÑоÑÑо глобалÑÐ½Ð°Ñ Ð¿ÐµÑеменнаÑ, ÑеÑез коÑоÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ доÑÑÑÑаÑÑÑÑ Ðº опÑеделÑÐ½Ð½Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ. ÐлобалÑнÑе пеÑеменнÑе не заÑиÑÐµÐ½Ñ Ð¾Ñ Ð·Ð°Ð¿Ð¸Ñи, поÑÑÐ¾Ð¼Ñ Ð»Ñбой код Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð´Ð¼ÐµÐ½ÑÑÑ Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð±ÐµÐ· ваÑего ведома. Ðо еÑÑÑ Ð¸ дÑÑгой нÑанÑ. ÐÐµÐ¿Ð»Ð¾Ñ Ð¾ Ð±Ñ Ñ ÑаниÑÑ Ð² одном меÑÑе и код, коÑоÑÑй ÑеÑÐ°ÐµÑ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ â1, а Ñакже имеÑÑ Ðº Ð½ÐµÐ¼Ñ Ð¿ÑоÑÑой и доÑÑÑпнÑй инÑеÑÑейÑ. ÐнÑеÑеÑно, ÑÑо в наÑе вÑÐµÐ¼Ñ Ð¿Ð°ÑÑеÑн ÑÑал наÑÑолÑко извеÑÑен, ÑÑо ÑепеÑÑ Ð»Ñди назÑваÑÑ Â«Ð¾Ð´Ð¸Ð½Ð¾Ñками» даже Ñе клаÑÑÑ, коÑоÑÑе ÑеÑаÑÑ Ð»Ð¸ÑÑ Ð¾Ð´Ð½Ñ Ð¸Ð· пÑоблем, пеÑеÑиÑленнÑÑ Ð²ÑÑе. __РеÑение__ ÐÑе ÑеализаÑии одиноÑки ÑводÑÑÑÑ Ðº ÑомÑ, ÑÑÐ¾Ð±Ñ ÑкÑÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¾Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ ÑоздаÑÑ Ð¿ÑблиÑнÑй ÑÑаÑиÑеÑкий меÑод, коÑоÑÑй и бÑÐ´ÐµÑ ÐºÐ¾Ð½ÑÑолиÑоваÑÑ Ð¶Ð¸Ð·Ð½ÐµÐ½Ð½Ñй Ñикл обÑекÑа-одиноÑки. ÐÑли Ñ Ð²Ð°Ñ ÐµÑÑÑ Ð´Ð¾ÑÑÑп к клаÑÑÑ Ð¾Ð´Ð¸Ð½Ð¾Ñки, знаÑиÑ, бÑÐ´ÐµÑ Ð´Ð¾ÑÑÑп и к ÑÑÐ¾Ð¼Ñ ÑÑаÑиÑеÑÐºÐ¾Ð¼Ñ Ð¼ÐµÑодÑ. Ðз какой ÑоÑки кода Ð²Ñ Ð±Ñ ÐµÐ³Ð¾ ни вÑзвали, он вÑегда бÑÐ´ÐµÑ Ð¾ÑдаваÑÑ Ð¾Ð´Ð¸Ð½ и ÑÐ¾Ñ Ð¶Ðµ обÑекÑ. ```java // ÐлаÑÑ Ð¾Ð´Ð¸Ð½Ð¾Ñки опÑеделÑÐµÑ ÑÑаÑиÑеÑкий меÑод `getInstance`, // коÑоÑÑй позволÑÐµÑ ÐºÐ»Ð¸ÐµÐ½Ñам повÑоÑно иÑполÑзоваÑÑ Ð¾Ð´Ð½Ð¾ и Ñо же // подклÑÑение к базе даннÑÑ Ð¿Ð¾ вÑей пÑогÑамме. class Database is // Ðоле Ð´Ð»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑа-одиноÑки должно бÑÑÑ Ð¾Ð±ÑÑвлено // ÑÑаÑиÑнÑм. private static field instance: Database // ÐонÑÑÑÑкÑÐ¾Ñ Ð¾Ð´Ð¸Ð½Ð¾Ñки вÑегда должен оÑÑаваÑÑÑÑ Ð¿ÑиваÑнÑм, // ÑÑÐ¾Ð±Ñ ÐºÐ»Ð¸ÐµÐ½ÑÑ Ð½Ðµ могли ÑамоÑÑоÑÑелÑно ÑоздаваÑÑ // ÑкземплÑÑÑ ÑÑого клаÑÑа ÑеÑез опеÑаÑÐ¾Ñ `new`. private constructor Database() is // ÐдеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¶Ð¸ÑÑ ÐºÐ¾Ð´ иниÑиализаÑии подклÑÑÐµÐ½Ð¸Ñ Ðº // ÑеÑвеÑÑ Ð±Ð°Ð· даннÑÑ . // ... // ÐÑновной ÑÑаÑиÑеÑкий меÑод одиноÑки ÑлÑÐ¶Ð¸Ñ Ð°Ð»ÑÑеÑнаÑивой // конÑÑÑÑкÑоÑÑ Ð¸ ÑвлÑеÑÑÑ ÑоÑкой доÑÑÑпа к ÑкземплÑÑÑ ÑÑого // клаÑÑа. public static method getInstance() is if (Database.instance == null) then acquireThreadLock() and then // Ðа вÑÑкий ÑлÑÑай еÑÑ Ñаз пÑовеÑим, не бÑл ли // обÑÐµÐºÑ Ñоздан дÑÑгим поÑоком, пока ÑекÑÑий // ждал оÑÐ²Ð¾Ð±Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки. if (Database.instance == null) then Database.instance = new Database() return Database.instance // ÐаконеÑ, лÑбой клаÑÑ Ð¾Ð´Ð¸Ð½Ð¾Ñки должен имеÑÑ ÐºÐ°ÐºÑÑ-Ñо // полезнÑÑ ÑÑнкÑионалÑноÑÑÑ, коÑоÑÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ Ð±ÑдÑÑ // запÑÑкаÑÑ ÑеÑез полÑÑеннÑй обÑÐµÐºÑ Ð¾Ð´Ð¸Ð½Ð¾Ñки. public method query(sql) is // ÐÑе запÑоÑÑ Ðº базе даннÑÑ Ð±ÑдÑÑ Ð¿ÑÐ¾Ñ Ð¾Ð´Ð¸ÑÑ ÑеÑез ÑÑÐ¾Ñ // меÑод. ÐоÑÑÐ¾Ð¼Ñ Ð¸Ð¼ÐµÐµÑ ÑмÑÑл помеÑÑиÑÑ ÑÑда какÑÑ-Ñо // Ð»Ð¾Ð³Ð¸ÐºÑ ÐºÐµÑиÑованиÑ. // ... class Application is method main() is Database foo = Database.getInstance() foo.query("SELECT ...") // ... Database bar = Database.getInstance() bar.query("SELECT ...") // ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ "bar" ÑодеÑÐ¶Ð¸Ñ ÑÐ¾Ñ Ð¶Ðµ обÑекÑ, ÑÑо и // пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ "foo". ``` __ÐÑименимоÑÑÑ__ Ðогда в пÑогÑамме должен бÑÑÑ ÐµÐ´Ð¸Ð½ÑÑвеннÑй ÑкземплÑÑ ÐºÐ°ÐºÐ¾Ð³Ð¾-Ñо клаÑÑа, доÑÑÑпнÑй вÑем клиенÑам (напÑимеÑ, обÑий доÑÑÑп к базе даннÑÑ Ð¸Ð· ÑазнÑÑ ÑаÑÑей пÑогÑаммÑ). ÐдиноÑка ÑкÑÑÐ²Ð°ÐµÑ Ð¾Ñ ÐºÐ»Ð¸ÐµÐ½Ñов вÑе ÑпоÑÐ¾Ð±Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ обÑекÑа, кÑоме ÑпеÑиалÑного меÑода. ÐÑÐ¾Ñ Ð¼ÐµÑод либо ÑоздаÑÑ Ð¾Ð±ÑекÑ, либо оÑдаÑÑ ÑÑÑеÑÑвÑÑÑий обÑекÑ, еÑли он Ñже бÑл Ñоздан. Ðогда вам Ñ Ð¾ÑеÑÑÑ Ð¸Ð¼ÐµÑÑ Ð±Ð¾Ð»ÑÑе конÑÑÐ¾Ð»Ñ Ð½Ð°Ð´ глобалÑнÑми пеÑеменнÑми. РоÑлиÑие Ð¾Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑÑ Ð¿ÐµÑеменнÑÑ , ÐдиноÑка гаÑанÑиÑÑеÑ, ÑÑо никакой дÑÑгой код не Ð·Ð°Ð¼ÐµÐ½Ð¸Ñ ÑозданнÑй ÑкземплÑÑ ÐºÐ»Ð°ÑÑа, поÑÑÐ¾Ð¼Ñ Ð²Ñ Ð²Ñегда ÑвеÑÐµÐ½Ñ Ð² налиÑии лиÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ обÑекÑа-одиноÑки. Тем не менее, в лÑбой Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑаÑÑиÑиÑÑ ÑÑо огÑаниÑение и позволиÑÑ Ð»Ñбое колиÑеÑÑво обÑекÑов-одиноÑек, поменÑв код в одном меÑÑе (меÑод getInstance). __Шаги ÑеализаÑии__ + ÐобавÑÑе в клаÑÑ Ð¿ÑиваÑное ÑÑаÑиÑеÑкое поле, коÑоÑое бÑÐ´ÐµÑ ÑодеÑжаÑÑ Ð¾Ð´Ð¸Ð½Ð¾ÑнÑй обÑекÑ. + ÐбÑÑвиÑе ÑÑаÑиÑеÑкий ÑоздаÑÑий меÑод, коÑоÑÑй бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¾Ð´Ð¸Ð½Ð¾Ñки. + ÐобавÑÑе «ленивÑÑ Ð¸Ð½Ð¸ÑиализаÑиÑ» (Ñоздание обÑекÑа пÑи пеÑвом вÑзове меÑода) в ÑоздаÑÑий меÑод одиноÑки. + СделайÑе конÑÑÑÑкÑÐ¾Ñ ÐºÐ»Ð°ÑÑа пÑиваÑнÑм. + РклиенÑÑком коде замениÑе вÑÐ·Ð¾Ð²Ñ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа одиноÑка вÑзовами его ÑоздаÑÑего меÑода. __ÐÑеимÑÑеÑÑва и недоÑÑаÑки__ + ÐаÑанÑиÑÑÐµÑ Ð½Ð°Ð»Ð¸Ñие единÑÑвенного ÑкземплÑÑа клаÑÑа. + ÐÑедоÑÑавлÑÐµÑ Ðº Ð½ÐµÐ¼Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑÑ ÑоÑÐºÑ Ð´Ð¾ÑÑÑпа. + РеализÑÐµÑ Ð¾ÑложеннÑÑ Ð¸Ð½Ð¸ÑиализаÑÐ¸Ñ Ð¾Ð±ÑекÑа-одиноÑки. + - ÐаÑÑÑÐ°ÐµÑ Ð¿ÑинÑип единÑÑвенной оÑвеÑÑÑвенноÑÑи клаÑÑа. + - ÐаÑкиÑÑÐµÑ Ð¿Ð»Ð¾Ñ Ð¾Ð¹ дизайн. + - ÐÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð¼ÑлÑÑипоÑоÑноÑÑи. + - ТÑебÑÐµÑ Ð¿Ð¾ÑÑоÑнного ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Mock-обÑекÑов пÑи ÑниÑ-ÑеÑÑиÑовании. ## ÐÑиведиÑе пÑимеÑÑ ÑÑÑÑкÑÑÑнÑÑ Ñаблонов пÑоекÑиÑованиÑ. + __ÐдапÑÐµÑ (Adapter)__ - ÑÑо ÑÑÑÑкÑÑÑнÑй паÑÑеÑн пÑоекÑиÑованиÑ, коÑоÑÑй позволÑÐµÑ Ð¾Ð±ÑекÑам Ñ Ð½ÐµÑовмеÑÑимÑми инÑеÑÑейÑами ÑабоÑаÑÑ Ð²Ð¼ÐµÑÑе. ÐÑимеÑ: + __ÐоÑÑ (Bridge)__ - ÑÑо ÑÑÑÑкÑÑÑнÑй паÑÑеÑн пÑоекÑиÑованиÑ, коÑоÑÑй ÑазделÑÐµÑ Ð¾Ð´Ð¸Ð½ или неÑколÑко клаÑÑов на две оÑделÑнÑе иеÑаÑÑ Ð¸Ð¸ â абÑÑÑакÑÐ¸Ñ Ð¸ ÑеализаÑиÑ, позволÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ Ð¸Ñ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимо дÑÑг Ð¾Ñ Ð´ÑÑга. ÐÑимеÑ: + __ÐомпоновÑик (Composite)__ - ÑÑо ÑÑÑÑкÑÑÑнÑй паÑÑеÑн пÑоекÑиÑованиÑ, коÑоÑÑй позволÑÐµÑ ÑгÑÑппиÑоваÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво обÑекÑов в дÑевовиднÑÑ ÑÑÑÑкÑÑÑÑ, а заÑем ÑабоÑаÑÑ Ñ Ð½ÐµÐ¹ Ñак, как бÑдÑо ÑÑо единиÑнÑй обÑекÑ. ÐÑимеÑ: + __ÐекоÑаÑоÑ (Decorator)__ - ÑÑо ÑÑÑÑкÑÑÑнÑй паÑÑеÑн пÑоекÑиÑованиÑ, коÑоÑÑй позволÑÐµÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки добавлÑÑÑ Ð¾Ð±ÑекÑам новÑÑ ÑÑнкÑионалÑноÑÑÑ, обоÑаÑÐ¸Ð²Ð°Ñ Ð¸Ñ Ð² полезнÑе «обÑÑÑки» без иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð°ÑледованиÑ. ÐÑимеÑ: + __ФаÑад (Facade)__ - ÑÑо ÑÑÑÑкÑÑÑнÑй паÑÑеÑн пÑоекÑиÑованиÑ, коÑоÑÑй пÑедоÑÑавлÑÐµÑ Ð¿ÑоÑÑой инÑеÑÑÐµÐ¹Ñ Ðº Ñложной ÑиÑÑеме клаÑÑов, библиоÑеке или ÑÑеймвоÑкÑ. ÐÑимеÑ: + __ÐÑиÑпоÑÐ¾Ð±Ð»ÐµÐ½ÐµÑ (Flyweight)__ - ÑÑо ÑÑÑÑкÑÑÑнÑй паÑÑеÑн пÑоекÑиÑованиÑ, коÑоÑÑй позволÑÐµÑ Ð²Ð¼ÐµÑÑиÑÑ Ð±Ã³Ð»ÑÑее колиÑеÑÑво обÑекÑов в оÑведÑннÑÑ Ð¾Ð¿ÐµÑаÑивнÑÑ Ð¿Ð°Ð¼ÑÑÑ. ÐÐµÐ³ÐºÐ¾Ð²ÐµÑ ÑÐºÐ¾Ð½Ð¾Ð¼Ð¸Ñ Ð¿Ð°Ð¼ÑÑÑ, ÑазделÑÑ Ð¾Ð±Ñее ÑоÑÑоÑние обÑекÑов Ð¼ÐµÐ¶Ð´Ñ Ñобой, вмеÑÑо Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²ÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð² каждом обÑекÑе. ÐÑедÑÑавлÑÑÑий ÑÐµÐ±Ñ ÐºÐ°Ðº ÑникалÑнÑй ÑкземплÑÑ Ð² ÑазнÑÑ Ð¼ÐµÑÑÐ°Ñ Ð¿ÑогÑаммÑ, но по ÑакÑÑ Ð½Ðµ ÑвлÑÑÑийÑÑ ÑаковÑм. ÐÑимеÑ: + __ÐамеÑÑиÑÐµÐ»Ñ (Proxy)__ - ÑÑо ÑÑÑÑкÑÑÑнÑй паÑÑеÑн пÑоекÑиÑованиÑ, коÑоÑÑй позволÑÐµÑ Ð¿Ð¾Ð´ÑÑавлÑÑÑ Ð²Ð¼ÐµÑÑо ÑеалÑнÑÑ Ð¾Ð±ÑекÑов ÑпеÑиалÑнÑе обÑекÑÑ-замениÑели. ÐÑи обÑекÑÑ Ð¿ÐµÑÐµÑ Ð²Ð°ÑÑваÑÑ Ð²ÑÐ·Ð¾Ð²Ñ Ðº оÑигиналÑÐ½Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ, позволÑÑ ÑделаÑÑ ÑÑо-Ñо до или поÑле пеÑедаÑи вÑзова оÑигиналÑ. ÐÑимеÑ: ÐºÐµÑ Ð² Hibernate, Ð»ÐµÐ½Ð¸Ð²Ð°Ñ Ð¸Ð½Ð¸ÑиализаÑÐ¸Ñ Ð² Hibernate, ÑÑанзакÑии в Spring [к оглавлениÑ](#ШаблонÑ-пÑоекÑиÑованиÑ) ## ÐÑиведиÑе пÑимеÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½ÑеÑÐºÐ¸Ñ Ñаблонов пÑоекÑиÑованиÑ. + __ЦепоÑка обÑзанноÑÑей (Chain of responsibility)__ - ÑÑо поведенÑеÑкий паÑÑеÑн пÑоекÑиÑованиÑ, коÑоÑÑй позволÑÐµÑ Ð¿ÐµÑедаваÑÑ Ð·Ð°Ð¿ÑоÑÑ Ð¿Ð¾ÑледоваÑелÑно по ÑепоÑке обÑабоÑÑиков. ÐаждÑй поÑледÑÑÑий обÑабоÑÑик ÑеÑаеÑ, Ð¼Ð¾Ð¶ÐµÑ Ð»Ð¸ он обÑабоÑаÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ñам и ÑÑÐ¾Ð¸Ñ Ð»Ð¸ пеÑедаваÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð´Ð°Ð»ÑÑе по Ñепи. + __Ðоманда (Command)__ - ÑÑо поведенÑеÑкий паÑÑеÑн пÑоекÑиÑованиÑ, коÑоÑÑй пÑевÑаÑÐ°ÐµÑ Ð·Ð°Ð¿ÑоÑÑ Ð² обÑекÑÑ, позволÑÑ Ð¿ÐµÑедаваÑÑ Ð¸Ñ ÐºÐ°Ðº аÑгÑменÑÑ Ð¿Ñи вÑзове меÑодов, ÑÑавиÑÑ Ð·Ð°Ð¿ÑоÑÑ Ð² оÑеÑедÑ, логиÑоваÑÑ Ð¸Ñ , а Ñакже поддеÑживаÑÑ Ð¾ÑÐ¼ÐµÐ½Ñ Ð¾Ð¿ÐµÑаÑий. + __ÐнÑеÑпÑеÑаÑÐ¾Ñ (Interpreter)__ - РеÑÐ°ÐµÑ ÑаÑÑо вÑÑÑеÑаÑÑÑÑÑÑ, но подвеÑженнÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñм, задаÑÑ. + __ÐÑеÑаÑоÑ (Iterator)__ - ÑÑо поведенÑеÑкий паÑÑеÑн пÑоекÑиÑованиÑ, коÑоÑÑй даÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¿Ð¾ÑледоваÑелÑно Ð¾Ð±Ñ Ð¾Ð´Ð¸ÑÑ ÑлеменÑÑ ÑоÑÑавнÑÑ Ð¾Ð±ÑекÑов, не ÑаÑкÑÑÐ²Ð°Ñ Ð¸Ñ Ð²Ð½ÑÑÑеннего пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ (без иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð¿Ð¸Ñаний каждого + __из обÑекÑов, Ð²Ñ Ð¾Ð´ÑÑÐ¸Ñ Ð² ÑоÑÑав агÑегаÑии). + __ÐоÑÑедник (Mediator)__ - ÑÑо поведенÑеÑкий паÑÑеÑн пÑоекÑиÑованиÑ, коÑоÑÑй позволÑÐµÑ ÑменÑÑиÑÑ ÑвÑзанноÑÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑва клаÑÑов Ð¼ÐµÐ¶Ð´Ñ Ñобой, благодаÑÑ Ð¿ÐµÑемеÑÐµÐ½Ð¸Ñ ÑÑÐ¸Ñ ÑвÑзей в один клаÑÑ-поÑÑедник. + __Снимок (Memento)__ - ÑÑо поведенÑеÑкий паÑÑеÑн пÑоекÑиÑованиÑ, коÑоÑÑй позволÑÐµÑ ÑÐ¾Ñ ÑанÑÑÑ Ð¸ воÑÑÑанавливаÑÑ Ð¿ÑоÑлÑе ÑоÑÑоÑÐ½Ð¸Ñ Ð¾Ð±ÑекÑов, не ÑаÑкÑÑÐ²Ð°Ñ Ð¿Ð¾Ð´ÑобноÑÑей Ð¸Ñ ÑеализаÑии. + __ÐаблÑдаÑелÑ (Observer)__ - ÑÑо поведенÑеÑкий паÑÑеÑн пÑоекÑиÑованиÑ, коÑоÑÑй ÑоздаÑÑ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ подпиÑки, позволÑÑÑий одним обÑекÑам ÑледиÑÑ Ð¸ ÑеагиÑоваÑÑ Ð½Ð° ÑобÑÑиÑ, пÑоиÑÑ Ð¾Ð´ÑÑие в дÑÑÐ³Ð¸Ñ Ð¾Ð±ÑекÑÐ°Ñ . ÐÑимеÑ: ContexLoaderListener в Hibernate. + __СоÑÑоÑние (State)__ - ÐÑполÑзÑеÑÑÑ Ð² ÑÐµÑ ÑлÑÑаÑÑ , когда во вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð¾Ð±ÑÐµÐºÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ менÑÑÑ ÑÐ²Ð¾Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ в завиÑимоÑÑи Ð¾Ñ Ñвоего ÑоÑÑоÑниÑ. + __СÑÑаÑÐµÐ³Ð¸Ñ (Strategy)__ - ÑÑо поведенÑеÑкий паÑÑеÑн пÑоекÑиÑованиÑ, коÑоÑÑй опÑеделÑÐµÑ ÑемейÑÑво ÑÑ Ð¾Ð¶Ð¸Ñ Ð°Ð»Ð³Ð¾ÑиÑмов и помеÑÐ°ÐµÑ ÐºÐ°Ð¶Ð´Ñй из Ð½Ð¸Ñ Ð² ÑобÑÑвеннÑй клаÑÑ, поÑле Ñего алгоÑиÑÐ¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ взаимозаменÑÑÑ Ð¿ÑÑмо во вÑÐµÐ¼Ñ Ð¸ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑогÑаммÑ. + __ШаблоннÑй меÑод (Template method)__ - ÑÑо поведенÑеÑкий паÑÑеÑн пÑоекÑиÑованиÑ, коÑоÑÑй опÑеделÑÐµÑ ÑÐºÐµÐ»ÐµÑ Ð°Ð»Ð³Ð¾ÑиÑма, пеÑекладÑÐ²Ð°Ñ Ð¾ÑвеÑÑÑвенноÑÑÑ Ð·Ð° некоÑоÑÑе его Ñаги на подклаÑÑÑ. ÐаÑÑеÑн позволÑÐµÑ Ð¿Ð¾Ð´ÐºÐ»Ð°ÑÑам пеÑеопÑеделÑÑÑ Ñаги алгоÑиÑма, не менÑÑ ÐµÐ³Ð¾ обÑей ÑÑÑÑкÑÑÑÑ. + __ÐоÑеÑиÑÐµÐ»Ñ (Visitor)__ - ÑÑо поведенÑеÑкий паÑÑеÑн пÑоекÑиÑованиÑ, коÑоÑÑй позволÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑ Ð² пÑогÑÐ°Ð¼Ð¼Ñ Ð½Ð¾Ð²Ñе опеÑаÑии, не изменÑÑ ÐºÐ»Ð°ÑÑÑ Ð¾Ð±ÑекÑов, над коÑоÑÑми ÑÑи опеÑаÑии могÑÑ Ð²ÑполнÑÑÑÑÑ. [к оглавлениÑ](#ШаблонÑ-пÑоекÑиÑованиÑ) ## ЧÑо Ñакое _«анÑипаÑÑеÑн»_? Ðакие анÑипаÑÑеÑÐ½Ñ Ð²Ñ Ð·Ð½Ð°ÐµÑе? __ÐнÑипаÑÑеÑн (anti-pattern)__ â ÑÑо ÑаÑпÑоÑÑÑанÑннÑй Ð¿Ð¾Ð´Ñ Ð¾Ð´ к ÑеÑÐµÐ½Ð¸Ñ ÐºÐ»Ð°ÑÑа ÑаÑÑо вÑÑÑеÑаÑÑÐ¸Ñ ÑÑ Ð¿Ñоблем, ÑвлÑÑÑийÑÑ Ð½ÐµÑÑÑекÑивнÑм, ÑиÑкованнÑм или непÑодÑкÑивнÑм. __Poltergeists (полÑеÑгейÑÑÑ)__ - ÑÑо клаÑÑÑ Ñ Ð¾Ð³ÑаниÑенной оÑвеÑÑÑвенноÑÑÑÑ Ð¸ ÑолÑÑ Ð² ÑиÑÑеме, ÑÑÑ ÐµÐ´Ð¸Ð½ÑÑвенное пÑедназнаÑение â пеÑедаваÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð² дÑÑгие клаÑÑÑ. ÐÑ ÑÑÑекÑивнÑй жизненнÑй Ñикл непÑодолжиÑелен. ÐолÑеÑгейÑÑÑ Ð½Ð°ÑÑÑаÑÑ ÑÑÑойноÑÑÑ Ð°ÑÑ Ð¸ÑекÑÑÑÑ Ð¿ÑогÑаммного обеÑпеÑениÑ, ÑÐ¾Ð·Ð´Ð°Ð²Ð°Ñ Ð¸Ð·Ð±ÑÑоÑнÑе (лиÑние) абÑÑÑакÑии, они ÑÑезмеÑно запÑÑаннÑ, ÑÐ»Ð¾Ð¶Ð½Ñ Ð´Ð»Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð¸ ÑÑÑÐ´Ð½Ñ Ð² ÑопÑовождении. ÐбÑÑно Ñакие клаÑÑÑ Ð·Ð°Ð´ÑмÑваÑÑÑÑ ÐºÐ°Ðº клаÑÑÑ-конÑÑоллеÑÑ, коÑоÑÑе ÑÑÑеÑÑвÑÑÑ ÑолÑко Ð´Ð»Ñ Ð²Ñзова меÑодов дÑÑÐ³Ð¸Ñ ÐºÐ»Ð°ÑÑов, заÑаÑÑÑÑ Ð² пÑедопÑеделенной поÑледоваÑелÑноÑÑи. ÐÑизнаки поÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¸ поÑледÑÑÐ²Ð¸Ñ Ð°Ð½ÑипаÑÑеÑна + ÐзбÑÑоÑнÑе межклаÑÑовÑе ÑвÑзи. + ÐÑеменнÑе аÑÑоÑиаÑии. + ÐлаÑÑÑ Ð±ÐµÐ· ÑоÑÑоÑÐ½Ð¸Ñ (ÑодеÑжаÑие ÑолÑко меÑÐ¾Ð´Ñ Ð¸ конÑÑанÑÑ). + ÐÑеменнÑе обÑекÑÑ Ð¸ клаÑÑÑ (Ñ Ð½ÐµÐ¿ÑодолжиÑелÑнÑм вÑеменем жизни). + ÐлаÑÑÑ Ñ ÐµÐ´Ð¸Ð½ÑÑвеннÑм меÑодом, коÑоÑÑй пÑедназнаÑен ÑолÑко Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ вÑзова дÑÑÐ³Ð¸Ñ ÐºÐ»Ð°ÑÑов поÑÑедÑÑвом вÑеменной аÑÑоÑиаÑии. + ÐлаÑÑÑ Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ меÑодов в ÑÑиле «ÑпÑавлениÑ», Ñакие как startProcess. ТипиÑнÑе пÑиÑÐ¸Ð½Ñ + ÐÑÑÑÑÑÑвие обÑекÑно-оÑиенÑиÑованной аÑÑ Ð¸ÑекÑÑÑÑ (аÑÑ Ð¸ÑекÑÐ¾Ñ Ð½Ðµ Ð¿Ð¾Ð½Ð¸Ð¼Ð°ÐµÑ Ð¾Ð±ÑекÑно-оÑиенÑиÑованной паÑадигмÑ). + ÐепÑавилÑнÑй вÑÐ±Ð¾Ñ Ð¿ÑÑи ÑеÑÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ñи. + ÐÑÐµÐ´Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð± аÑÑ Ð¸ÑекÑÑÑе пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° ÑÑапе анализа ÑÑебований (до обÑекÑно-оÑиенÑиÑованного анализа) могÑÑ Ñакже веÑÑи к пÑоблемам на подобии ÑÑого анÑипаÑÑеÑна. __ÐнеÑÐµÐ½Ð½Ð°Ñ ÑложноÑÑÑ (Introduced complexity)__: ÐеобÑзаÑелÑÐ½Ð°Ñ ÑложноÑÑÑ Ð´Ð¸Ð·Ð°Ð¹Ð½Ð°. ÐмеÑÑо одного пÑоÑÑого клаÑÑа вÑÑÑÑаиваеÑÑÑ ÑÐµÐ»Ð°Ñ Ð¸ÐµÑаÑÑ Ð¸Ñ Ð¸Ð½ÑеÑÑейÑов и клаÑÑов. ТипиÑнÑй пÑÐ¸Ð¼ÐµÑ Â«ÐнÑеÑÑÐµÐ¹Ñ - ÐбÑÑÑакÑнÑй клаÑÑ - ÐдинÑÑвеннÑй клаÑÑ ÑеализÑÑÑий инÑеÑÑÐµÐ¹Ñ Ð½Ð° оÑнове абÑÑÑакÑного». __ÐнвеÑÑÐ¸Ñ Ð°Ð±ÑÑÑакÑии (Abstraction inversion)__: СокÑÑÑие ÑаÑÑи ÑÑнкÑионалÑноÑÑи Ð¾Ñ Ð²Ð½ÐµÑнего иÑполÑзованиÑ, в надежде на Ñо, ÑÑо никÑо не бÑÐ´ÐµÑ ÐµÐ³Ð¾ иÑполÑзоваÑÑ. __ÐеопÑеделÑÐ½Ð½Ð°Ñ ÑоÑка зÑÐµÐ½Ð¸Ñ (Ambiguous viewpoint)__: ÐÑедÑÑавление модели без ÑпеÑиÑикаÑии ÐµÑ ÑоÑки ÑаÑÑмоÑÑениÑ. __ÐолÑÑой комок гÑÑзи (Big ball of mud)__: СиÑÑема Ñ Ð½ÐµÑаÑпознаваемой ÑÑÑÑкÑÑÑой. __ÐожеÑÑвеннÑй обÑÐµÐºÑ (God object)__: ÐонÑенÑÑаÑÐ¸Ñ ÑлиÑком болÑÑого колиÑеÑÑва ÑÑнкÑий в одной ÑаÑÑи ÑиÑÑÐµÐ¼Ñ (клаÑÑе). __ÐаÑÑÑка на ввод даннÑÑ (Input kludge)__: ÐабÑвÑивоÑÑÑ Ð² ÑпеÑиÑикаÑии и вÑполнении поддеÑжки возможного невеÑного ввода. __РаздÑвание инÑеÑÑейÑа (Interface bloat)__: РазÑабоÑка инÑеÑÑейÑа оÑÐµÐ½Ñ Ð¼Ð¾ÑнÑм и оÑÐµÐ½Ñ ÑложнÑм Ð´Ð»Ñ ÑеализаÑии. __ÐолÑÐµÐ±Ð½Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° (Magic pushbutton)__: ÐÑполнение ÑезÑлÑÑаÑов дейÑÑвий полÑзоваÑÐµÐ»Ñ Ð² виде Ð½ÐµÐ¿Ð¾Ð´Ñ Ð¾Ð´ÑÑего (недоÑÑаÑоÑно абÑÑÑакÑного) инÑеÑÑейÑа. ÐапÑимеÑ, напиÑание пÑикладной логики в обÑабоÑÑÐ¸ÐºÐ°Ñ Ð½Ð°Ð¶Ð°Ñий на кнопкÑ. __ÐеÑеÑÑÑковка (Re-Coupling)__: ÐÑоÑеÑÑ Ð²Ð½ÐµÐ´ÑÐµÐ½Ð¸Ñ Ð½ÐµÐ½Ñжной завиÑимоÑÑи. __ÐÑÐ¼Ð¾Ñ Ð¾Ð´ (Stovepipe System)__: Редко поддеÑÐ¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ ÑбоÑка Ð¿Ð»Ð¾Ñ Ð¾ ÑвÑзаннÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñов. __СоÑÑоÑние гонки (Race hazard)__: непÑедвидение возможноÑÑи наÑÑÑÐ¿Ð»ÐµÐ½Ð¸Ñ ÑобÑÑий в поÑÑдке, оÑлиÑном Ð¾Ñ Ð¾Ð¶Ð¸Ð´Ð°ÐµÐ¼Ð¾Ð³Ð¾. __ЧленовÑедиÑелÑÑÑво (Mutilation)__: ÐзлиÑнее «заÑаÑивание» обÑекÑа под опÑеделеннÑÑ Ð¾ÑÐµÐ½Ñ ÑзкÑÑ Ð·Ð°Ð´Ð°ÑÑ Ñаким обÑазом, ÑÑо он не ÑпоÑобен бÑÐ´ÐµÑ ÑабоÑаÑÑ Ñ Ð½Ð¸ÐºÐ°ÐºÐ¸Ð¼Ð¸ инÑми, пÑÑÑÑ Ð¸ оÑÐµÐ½Ñ ÑÑ Ð¾Ð¶Ð¸Ð¼Ð¸ задаÑами. __Ð¡Ð¾Ñ Ñанение или ÑмеÑÑÑ (Save or die)__: Ð¡Ð¾Ñ Ñанение изменений лиÑÑ Ð¿Ñи завеÑÑении пÑиложениÑ. [к оглавлениÑ](#ШаблонÑ-пÑоекÑиÑованиÑ) ## ЧÑо Ñакое _Dependency Injection_? __Dependency Injection (внедÑение завиÑимоÑÑи)__ - ÑÑо Ð½Ð°Ð±Ð¾Ñ Ð¿Ð°ÑÑеÑнов и пÑинÑипов ÑазÑабоÑки пÑогÑамного обеÑпеÑениÑ, коÑоÑÑе позволÑÑÑ Ð¿Ð¸ÑаÑÑ ÑлабоÑвÑзнÑй код. Рполном ÑооÑвеÑÑÑвии Ñ Ð¿ÑинÑипом единой обÑзанноÑÑи обÑÐµÐºÑ Ð¾ÑдаÑÑ Ð·Ð°Ð±Ð¾ÑÑ Ð¾ поÑÑÑоении ÑÑебÑемÑÑ ÐµÐ¼Ñ Ð·Ð°Ð²Ð¸ÑимоÑÑей внеÑнемÑ, ÑпеÑиалÑно пÑедназнаÑÐµÐ½Ð½Ð¾Ð¼Ñ Ð´Ð»Ñ ÑÑого обÑÐµÐ¼Ñ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ñ. [к оглавлениÑ](#ШаблонÑ-пÑоекÑиÑованиÑ) # ÐÑÑоÑники + [ÐикипедиÑ](https://ru.wikipedia.org/wiki/Шаблон_пÑоекÑиÑованиÑ) + [Javenue](http://www.javenue.info/post/56) [ÐопÑоÑÑ Ð´Ð»Ñ ÑобеÑедованиÑ](README.md)