{"id":462355,"date":"2025-06-08T03:00:03","date_gmt":"2025-06-08T03:00:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=462355"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=462355","title":{"rendered":"<span>\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 \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043d\u0430 Swift \u0434\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cb4\/efe\/03b\/cb4efe03b7799b5d28e5c9226d62dab6.png\" width=\"1200\" height=\"562\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/cb4\/efe\/03b\/cb4efe03b7799b5d28e5c9226d62dab6.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cb4\/efe\/03b\/cb4efe03b7799b5d28e5c9226d62dab6.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u0417\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0447\u0442\u043e\u0431\u044b \u0432 \u0447\u0435\u043c \u0442\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u0435\u0435 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0447\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0430\u0443\u043c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435.\u0420\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u044f\u0434 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0430\u0442\u044c \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.\u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f =), \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u043c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u043c.<\/p>\n<h2>\u0424\u0430\u0431\u0440\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \/Factory Method<\/h2>\n<p><strong>\u0424\u0430\u0431\u0440\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434<\/strong>\u00a0\u2014 \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 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043e\u0431\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u0441\u0443\u043f\u0435\u0440\u043a\u043b\u0430\u0441\u0441\u0435, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u0430\u043c \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0442\u0438\u043f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445\u00a0\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c UI \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0438 \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043c\u043e\u0433 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0432 iOS \u0438 \u0432 Windows. \u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u0441\u0432\u043e\u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 UI \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u041d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u0431\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043d\u0430\u0448\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u0412 \u044d\u0442\u043e\u043c \u043d\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0444\u0430\u0431\u0440\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434.<\/p>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b.<\/p>\n<pre><code class=\"swift\">protocol IButton {     func render()     func onClick() }<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043d\u043e\u043f\u043a\u0438 \u0434\u043b\u044f windows \u0438 \u0434\u043b\u044f iOS.<\/p>\n<pre><code class=\"swift\">class windowsButton: IButton {     func render() {         print(\"wiwindowsButton.windowsButton\")     }          func onClick() {         print(\"windowsButton.onClick\")     } }  class iosButton: IButton {     func render() {         print(\"iosButton.windowsButton\")     }          func onClick() {         print(\"iosButton.onClick\")     } }<\/code><\/pre>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044f. \u042d\u0442\u043e \u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0435\u0435 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435.<\/p>\n<pre><code class=\"swift\">protocol iCreator {     func render()     func createButton() -&gt; IButton }<\/code><\/pre>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0438 \u0434\u043b\u044f \u043e\u0431\u0435\u0438\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c.<\/p>\n<pre><code class=\"swift\">class windowsCreator: iCreator {     func render() {         let button = createButton()         button.render()         print(\"rendering windows button\")     }          func createButton() -&gt; IButton {         print(\"creating windows button\")         return windowsButton()     } }  class iosCreator: iCreator {     func render() {         let button = createButton()         button.render()         print(\"rendering ios button\")     }          func createButton() -&gt; IButton {         print(\"creating ios button\")         return iosButton()     } }<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432 \u043c\u0435\u0442\u043e\u0434\u0430 createButton iosCreator \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 iosButton, \u0430 windowsCreator \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e windowsButton.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448 \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043d \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c iOS \u0438\u043b\u0438 Windows UI \u044d\u043b\u0435\u043c\u0435\u043d\u0442.<\/p>\n<pre><code class=\"swift\">\/\/ Application enum System {     case windows     case ios }  class MyAplication {     let creator: iCreator?          init(system: System) {         switch system {         case .windows:             creator = windowsCreator()         case.ios:             creator = iosCreator()         }     } }<\/code><\/pre>\n<p>\u0412 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<pre><code class=\"swift\">let myApplication = MyAplication(system: .windows) myApplication.creator?.render()<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e\u0437\u0434\u0430\u0441\u0442\u0441\u044f \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c\u0441\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0434\u043b\u044f Windows.<\/p>\n<h2>\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0430 \/ Abstract Factory<\/h2>\n<p><strong>\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0430<\/strong>\u00a0\u2014 \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 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u044f\u0441\u044c \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u0430\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445\u00a0\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<p>\u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435\u043c \u0444\u0430\u0431\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0430.<\/p>\n<p>\u0427\u0442\u043e \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435 \u043e\u0434\u0438\u043d UI \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0430 \u0446\u0435\u043b\u043e\u0435 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u0440\u0435\u0434\u044b \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u043d\u0430\u0448\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0438\u043b\u0438 \u0438\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439. <\/p>\n<p>\u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u043c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0430.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0434\u0432\u0430. \u041a\u043d\u043e\u043f\u043a\u0443 \u0438 \u0447\u0435\u043a\u0431\u043e\u043a\u0441.<\/p>\n<pre><code class=\"swift\">protocol IButton {     func pressButton() }  protocol ICheckmark {     func chooseCheckMark() }<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u044b \u043a\u043d\u043e\u043f\u043e\u043a.<\/p>\n<pre><code class=\"swift\">class WindowsButton: IButton {     func pressButton() {         print(\"Windows button pressed\")     } }  class IosButton: IButton {     func pressButton() {         print(\"IOS button pressed\")     } } <\/code><\/pre>\n<p>\u0418 \u043a\u043b\u0430\u0441\u0441\u044b \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u043e\u0432.<\/p>\n<pre><code class=\"swift\">class WindowsCheckmark: ICheckmark {     func chooseCheckMark() {         print(\"Windows checkmark choosen\")     } }  class IosCheckmark: ICheckmark {     func chooseCheckMark() {         print(\"IOS checkmark choosen\")     } }<\/code><\/pre>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0444\u0430\u0431\u0440\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.<\/p>\n<pre><code class=\"swift\">protocol AbstractUIElementsFactory {     func makeButton() -&gt; IButton     func makeCheckmark() -&gt; ICheckmark }<\/code><\/pre>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c Windows \u0444\u0430\u0431\u0440\u0438\u043a\u0443.<\/p>\n<pre><code class=\"swift\">class WindowsUIElementsFactory: AbstractUIElementsFactory {     func makeButton() -&gt; IButton {         print(\"Windows button is creating ...\")         return WindowsButton()     }          func makeCheckmark() -&gt; ICheckmark {         print(\"Windows checkmark is creating ...\")         return WindowsCheckmark()     } }<\/code><\/pre>\n<p> \u0418 iOS \u0444\u0430\u0431\u0440\u0438\u043a\u0443.<\/p>\n<pre><code class=\"swift\">class IosUIElementsFactory: AbstractUIElementsFactory {     func makeButton() -&gt; IButton {         print(\"IOS button is creating ...\")         return IosButton()     }          func makeCheckmark() -&gt; ICheckmark {         print(\"IOS checkmark is creating ...\")         return IosCheckmark()     } }<\/code><\/pre>\n<p>\u0412 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u043c \u043a\u043e\u0434\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0432\u044b\u0437\u044b\u0432\u0430\u044f \u043c\u0435\u0442\u043e\u0434\u044b \u0444\u0430\u0431\u0440\u0438\u043a\u0438.<\/p>\n<pre><code class=\"swift\">class  Client {     static func createUIElements(factory: AbstractUIElementsFactory) {         let button = factory.makeButton()         let checkmark = factory.makeCheckmark()                  button.pressButton()         checkmark.chooseCheckMark()     } }<\/code><\/pre>\n<p>\u0410 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435  \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u0438\u043f\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0430\u0431\u0440\u0438\u043a\u0438.<\/p>\n<pre><code class=\"swift\">Client.createUIElements(factory: WindowsUIElementsFactory()) print(\"\") Client.createUIElements(factory: IosUIElementsFactory())<\/code><\/pre>\n<h2>\u0421\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \/ Builder<\/h2>\n<p><strong>\u0421\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c<\/strong>\u00a0\u2014 \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 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e. \u0421\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439\u00a0\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<p>\u041a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439\u00a0\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u0439 \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430. \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044f \u0438\u0445 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432 \u0440\u0443\u0447\u043d\u0443\u044e \u043b\u0435\u0433\u043a\u043e \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f. \u0422\u0443\u0442 \u043d\u0430\u043c \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0439\u0442\u0438 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c.<\/p>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044c.<\/p>\n<pre><code class=\"swift\">final class Car {     var seats = 0     var engine = \"\"     var tripComputer = \"\"     var gps = false          init() {         print(\"Car is creating ...\")     }          func printDescription() {         print(\"seats: \\(seats)\\nengine: \\(engine)\\ntripComputer: \\(tripComputer)\\ngps: \\(gps)\\n\")     } }<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u0438\u0437\u0434\u0435\u043b\u0438\u0435, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043a  \u043d\u0435\u043c\u0443, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0432\u0441\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044f.<\/p>\n<pre><code class=\"swift\">final class Manual {     var seats = \"\"     var engine = \"\"     var tripComputer = \"\"     var gps = \"\"          init() {         print(\"Manual is creating ...\")     }          func printDescription() {         print(\"seats: \\(seats)\\nengine: \\(engine)\\ntripComputer: \\(tripComputer)\\ngps: \\(gps)\\n\")     } }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044c \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u043d\u0430\u0435\u0442 \u043a\u0430\u043a \u0438\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c, \u043d\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0432 \u043a\u0430\u043a\u0438\u0435 \u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435  \u0432\u0430\u0436\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.<\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f.<\/p>\n<pre><code class=\"swift\">protocol Builder {     func reset()     func setSeats(_ : Int)     func setEngine(_ : String)     func setTripComputer(_ : String)     func setGPS(_ : Bool) }<\/code><\/pre>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044f.<\/p>\n<pre><code class=\"swift\">final class CarBuilder: Builder {     private var car = Car()          \/\/ MARK: - Protocol methods     func reset() {         car = Car()     }          func setSeats(_ seats: Int) {         car.seats = seats     }          func setEngine(_ engine: String) {         car.engine = engine     }          func setTripComputer(_ computer: String) {         car.tripComputer = computer     }          func setGPS(_ isSet: Bool) {         car.gps = isSet ? true : false     }          \/\/ MARK: - getResult method     func getResult() -&gt; Car {         return car     } }<\/code><\/pre>\n<p>\u0410 \u0442\u0430\u043a \u0436\u0435 \u043a\u043b\u0430\u0441\u0441 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438.<\/p>\n<pre><code class=\"swift\">final class ManualBuilder: Builder {     private var manual = Manual()          \/\/ MARK: - Protocol methods     func reset() {         manual = Manual()     }          func setSeats(_ seats: Int) {         let ending = seats == 1 ? \"seat\" : \"seats\"         manual.seats = \"Car has \\(seats) \\(ending)\"     }          func setEngine(_ engine: String) {         manual.engine = \"Car has \\(engine) engine\"     }          func setTripComputer(_ computer: String) {         manual.tripComputer = \"Car has \\(computer) computer\"     }          func setGPS(_ isSet: Bool) {         manual.gps = isSet ? \"GPS is set\" : \"There is no GPS\"     }          \/\/ MARK: - getResult method     func getResult() -&gt; Manual {         return manual     } }<\/code><\/pre>\n<p>\u0422\u0430\u043a \u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0430 \u0438 \u043f\u0440\u0435\u0434\u0430\u0442\u044c \u0435\u043c\u0443 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f\u043c\u0438.<\/p>\n<pre><code class=\"swift\">final class Director {     func constructSportsCar(builder: Builder) {         builder.reset()         builder.setSeats(2)         builder.setEngine(\"Honda\")         builder.setTripComputer(\"Apple\")         builder.setGPS(true)     } }<\/code><\/pre>\n<p>\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u0437\u0430\u0434\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432. \u041a\u043b\u0430\u0441\u0441 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440 \u0432 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0435 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u0435\u043d, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435. \u041d\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u0435\u0442 \u0432\u044b\u0437\u043e\u0432\u044b \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u0438 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u043c \u043f\u043e\u043b\u0435\u0437\u0435\u043d.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044c \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u043a \u043d\u0435\u043c\u0443 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f\u043c\u0438.<\/p>\n<pre><code class=\"swift\">\/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0430 \u0438 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u0435\u0439 let director = Director() let carBuilder = CarBuilder() let manualBuilder = ManualBuilder()  \/\/ \u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432 \u043c\u0435\u0442\u043e\u0434 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u0442\u0440\u0438\u0442\u0435\u043b\u044f \u0430\u0432\u0442\u043e director.constructSportsCar(builder: carBuilder) let car = carBuilder.getResult() car.printDescription()  \/\/ \u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432 \u043c\u0435\u0442\u043e\u0434 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u0442\u0440\u0438\u0442\u0435\u043b\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 director.constructSportsCar(builder: manualBuilder) let manual = manualBuilder.getResult() manual.printDescription()<\/code><\/pre>\n<p>\u0412\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0435 \u043e\u0442 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0430, \u0430 \u043e\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u0438 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u0435\u0439 \u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432.<\/p>\n<pre><code class=\"swift\">let car = carBuilder.getResult()<\/code><\/pre>\n<h2>\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \/ Prototype<\/h2>\n<p><strong>\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f<\/strong>\u00a0\u2014 \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 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043d\u0435 \u0432\u0434\u0430\u0432\u0430\u044f\u0441\u044c \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0438\u0445\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435 \u043f\u043e\u043b\u044f, \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0438\u0437 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442. <\/p>\n<p>\u041a\u0430\u043a \u0431\u044b\u0442\u044c \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044f\u0437\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0431\u044f \u0441\u0430\u043c\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443, \u0432\u0435\u0434\u044c \u043e\u043d \u043f\u0440\u043e \u0441\u0435\u0431\u044f \u0437\u043d\u0430\u0435\u0442 \u0432\u0441\u0435 \u0438 \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u043e \u0432\u0441\u0435\u043c \u0441\u0432\u043e\u0438\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0435.<\/p>\n<p>\u0412 Swift \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0427\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u043c \u0441\u0435\u0431\u044f, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0451\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b NSCopying, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043c\u0435\u0442\u043e\u0434<code>copy<\/code>.<\/p>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u0442\u0435\u043c\u0443. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044c.<\/p>\n<pre><code class=\"swift\">class Car: NSCopying, Equatable {     var model: String     var color: String     var numberOfSeats: Int          required init(model: String = \"\", color: String = \"\", numberOfSeats: Int = 2) {         self.model = model         self.color = color         self.numberOfSeats = numberOfSeats     }      \/\/ \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f     \/\/ MARK: - NSCopying     func copy(with zone: NSZone? = nil) -&gt; Any {         let protorype = type(of: self).init()                  protorype.model = model         protorype.color = color         protorype.numberOfSeats = numberOfSeats                  return protorype     }      \/\/ \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c            \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0430\u0432\u0442\u043e \u0441 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u043e\u043c.     \/\/ MARK: - Equatable     static func == (lhs: Car, rhs: Car) -&gt; Bool {         return lhs.model == rhs.model &amp;&amp;         lhs.color == rhs.color &amp;&amp;         lhs.numberOfSeats == rhs.numberOfSeats     } }<\/code><\/pre>\n<p>\u0412 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u043c \u043a\u043e\u0434\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u0430\u0448\u0438\u043d\u0443, \u043a\u043b\u043e\u043d\u0438\u0432\u0448\u0435\u043c \u0435\u0435 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0434\u0432\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430.<\/p>\n<pre><code class=\"swift\">let teslaCar = Car(model: \"Tesla\", color: \"Red\", numberOfSeats: 2) teslaCar.engine = \"TeslaElectric\"  let teslaCarCopy = teslaCar.copy() as? Car  print(teslaCar == teslaCar)<\/code><\/pre>\n<h2>\u041e\u0434\u0438\u043d\u043e\u0447\u043a\u0430 \/ Singleton<\/h2>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0431\u044b\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u0430\u043a\u043e-\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,  \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 API \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440.<\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0443 \u043e\u0434\u0438\u043d\u043e\u0447\u043a\u0430.<\/p>\n<pre><code class=\"swift\">class Singleton {      \/\/ \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043e\u043b\u0435, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0443 \u043e\u0434\u0438\u043d\u043e\u0447\u043a\u0438.     \/\/ \u042d\u0442\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430.     static var shared: Singleton = {         let instance = Singleton()         \/\/ ... \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430         \/\/ ...         return instance     }()      \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u041e\u0434\u0438\u043d\u043e\u0447\u043a\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u043a\u0440\u044b\u0442\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c     \/\/ \u043f\u0440\u044f\u043c\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440.     private init() {}      \/\/ \u041b\u044e\u0431\u043e\u0439 \u043e\u0434\u0438\u043d\u043e\u0447\u043a\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0443,     \/\/ \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u043d\u0430 \u0435\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0435.     func someBusinessLogic() -&gt; String {         \/\/ ...         return \"Result of the 'someBusinessLogic' call\"     } }<\/code><\/pre>\n<p>\u041e\u0434\u0438\u043d\u043e\u0447\u043a\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c\u044b\u043c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c  \u043c\u0435\u0442\u043e\u0434  copy(with zone:) \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u0434\u0438\u043d\u043e\u0447\u043a\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0431\u044f.<\/p>\n<pre><code class=\"swift\">extension Singleton: NSCopying {      func copy(with zone: NSZone? = nil) -&gt; Any {         return self     } }<\/code><\/pre>\n<p>\u0412 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u043c \u043a\u043e\u0434\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u0434\u0438\u043d\u043e\u0447\u043a\u0438 \u0443 \u043d\u0430 \u043e\u0434\u0438\u043d.<\/p>\n<pre><code class=\"swift\">let instance1 = Singleton.shared let instance2 = Singleton.shared  if (instance1 === instance2) {     print(\"Singleton works, both variables contain the same instance.\") } else {     print(\"Singleton failed, variables contain different instances.\") }<\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u0440\u043e \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0432\u0441\u0435. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0442\u0430\u043a\u043e\u0439 \u043d\u0435 \u0441\u0430\u043c\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0435\u043c\u0435 \u043a\u0430\u043a \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/916564\/\"> https:\/\/habr.com\/ru\/articles\/916564\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u0417\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0447\u0442\u043e\u0431\u044b \u0432 \u0447\u0435\u043c \u0442\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u0435\u0435 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0447\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0430\u0443\u043c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435.\u0420\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u044f\u0434 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0430\u0442\u044c \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.\u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f =), \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u043c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u043c.<\/p>\n<h2>\u0424\u0430\u0431\u0440\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \/Factory Method<\/h2>\n<p><strong>\u0424\u0430\u0431\u0440\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434<\/strong>\u00a0\u2014 \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 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043e\u0431\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u0441\u0443\u043f\u0435\u0440\u043a\u043b\u0430\u0441\u0441\u0435, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u0430\u043c \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0442\u0438\u043f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445\u00a0\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c UI \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0438 \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043c\u043e\u0433 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0432 iOS \u0438 \u0432 Windows. \u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u0441\u0432\u043e\u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 UI \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u041d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u0431\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043d\u0430\u0448\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u0412 \u044d\u0442\u043e\u043c \u043d\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0444\u0430\u0431\u0440\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434.<\/p>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b.<\/p>\n<pre><code class=\"swift\">protocol IButton {     func render()     func onClick() }<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043d\u043e\u043f\u043a\u0438 \u0434\u043b\u044f windows \u0438 \u0434\u043b\u044f iOS.<\/p>\n<pre><code class=\"swift\">class windowsButton: IButton {     func render() {         print(\"wiwindowsButton.windowsButton\")     }          func onClick() {         print(\"windowsButton.onClick\")     } }  class iosButton: IButton {     func render() {         print(\"iosButton.windowsButton\")     }          func onClick() {         print(\"iosButton.onClick\")     } }<\/code><\/pre>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044f. \u042d\u0442\u043e \u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0435\u0435 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435.<\/p>\n<pre><code class=\"swift\">protocol iCreator {     func render()     func createButton() -&gt; IButton }<\/code><\/pre>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0438 \u0434\u043b\u044f \u043e\u0431\u0435\u0438\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c.<\/p>\n<pre><code class=\"swift\">class windowsCreator: iCreator {     func render() {         let button = createButton()         button.render()         print(\"rendering windows button\")     }          func createButton() -&gt; IButton {         print(\"creating windows button\")         return windowsButton()     } }  class iosCreator: iCreator {     func render() {         let button = createButton()         button.render()         print(\"rendering ios button\")     }          func createButton() -&gt; IButton {         print(\"creating ios button\")         return iosButton()     } }<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432 \u043c\u0435\u0442\u043e\u0434\u0430 createButton iosCreator \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 iosButton, \u0430 windowsCreator \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e windowsButton.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448 \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043d \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c iOS \u0438\u043b\u0438 Windows UI \u044d\u043b\u0435\u043c\u0435\u043d\u0442.<\/p>\n<pre><code class=\"swift\">\/\/ Application enum System {     case windows     case ios }  class MyAplication {     let creator: iCreator?          init(system: System) {         switch system {         case .windows:             creator = windowsCreator()         case.ios:             creator = iosCreator()         }     } }<\/code><\/pre>\n<p>\u0412 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<pre><code class=\"swift\">let myApplication = MyAplication(system: .windows) myApplication.creator?.render()<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043e\u0437\u0434\u0430\u0441\u0442\u0441\u044f \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c\u0441\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0434\u043b\u044f Windows.<\/p>\n<h2>\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0430 \/ Abstract Factory<\/h2>\n<p><strong>\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0430<\/strong>\u00a0\u2014 \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 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u044f\u0441\u044c \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u0430\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445\u00a0\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<p>\u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435\u043c \u0444\u0430\u0431\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0430.<\/p>\n<p>\u0427\u0442\u043e \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435 \u043e\u0434\u0438\u043d UI \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0430 \u0446\u0435\u043b\u043e\u0435 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u0440\u0435\u0434\u044b \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u043d\u0430\u0448\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0438\u043b\u0438 \u0438\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439. <\/p>\n<p>\u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u043c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u0444\u0430\u0431\u0440\u0438\u043a\u0430.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0434\u0432\u0430. \u041a\u043d\u043e\u043f\u043a\u0443 \u0438 \u0447\u0435\u043a\u0431\u043e\u043a\u0441.<\/p>\n<pre><code class=\"swift\">protocol IButton {     func pressButton() }  protocol ICheckmark {     func chooseCheckMark() }<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u044b \u043a\u043d\u043e\u043f\u043e\u043a.<\/p>\n<pre><code class=\"swift\">class WindowsButton: IButton {     func pressButton() {         print(\"Windows button pressed\")     } }  class IosButton: IButton {     func pressButton() {         print(\"IOS button pressed\")     } } <\/code><\/pre>\n<p>\u0418 \u043a\u043b\u0430\u0441\u0441\u044b \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u043e\u0432.<\/p>\n<pre><code class=\"swift\">class WindowsCheckmark: ICheckmark {     func chooseCheckMark() {         print(\"Windows checkmark choosen\")     } }  class IosCheckmark: ICheckmark {     func chooseCheckMark() {         print(\"IOS checkmark choosen\")     } }<\/code><\/pre>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0444\u0430\u0431\u0440\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.<\/p>\n<pre><code class=\"swift\">protocol AbstractUIElementsFactory {     func makeButton() -&gt; IButton     func makeCheckmark() -&gt; ICheckmark }<\/code><\/pre>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c Windows \u0444\u0430\u0431\u0440\u0438\u043a\u0443.<\/p>\n<pre><code class=\"swift\">class WindowsUIElementsFactory: AbstractUIElementsFactory {     func makeButton() -&gt; IButton {         print(\"Windows button is creating ...\")         return WindowsButton()     }          func makeCheckmark() -&gt; ICheckmark {         print(\"Windows checkmark is creating ...\")         return WindowsCheckmark()     } }<\/code><\/pre>\n<p> \u0418 iOS \u0444\u0430\u0431\u0440\u0438\u043a\u0443.<\/p>\n<pre><code class=\"swift\">class IosUIElementsFactory: AbstractUIElementsFactory {     func makeButton() -&gt; IButton {         print(\"IOS button is creating ...\")         return IosButton()     }          func makeCheckmark() -&gt; ICheckmark {         print(\"IOS checkmark is creating ...\")         return IosCheckmark()     } }<\/code><\/pre>\n<p>\u0412 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u043c \u043a\u043e\u0434\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0432\u044b\u0437\u044b\u0432\u0430\u044f \u043c\u0435\u0442\u043e\u0434\u044b \u0444\u0430\u0431\u0440\u0438\u043a\u0438.<\/p>\n<pre><code class=\"swift\">class  Client {     static func createUIElements(factory: AbstractUIElementsFactory) {         let button = factory.makeButton()         let checkmark = factory.makeCheckmark()                  button.pressButton()         checkmark.chooseCheckMark()     } }<\/code><\/pre>\n<p>\u0410 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435  \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u0438\u043f\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0430\u0431\u0440\u0438\u043a\u0438.<\/p>\n<pre><code class=\"swift\">Client.createUIElements(factory: WindowsUIElementsFactory()) print(\"\") Client.createUIElements(factory: IosUIElementsFactory())<\/code><\/pre>\n<h2>\u0421\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \/ Builder<\/h2>\n<p><strong>\u0421\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c<\/strong>\u00a0\u2014 \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 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e. \u0421\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439\u00a0\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<p>\u041a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439\u00a0\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u0439 \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430. \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044f \u0438\u0445 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432 \u0440\u0443\u0447\u043d\u0443\u044e \u043b\u0435\u0433\u043a\u043e \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f. \u0422\u0443\u0442 \u043d\u0430\u043c \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0439\u0442\u0438 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c.<\/p>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044c.<\/p>\n<pre><code class=\"swift\">final class Car {     var seats = 0     var engine = \"\"     var tripComputer = \"\"     var gps = false          init() {         print(\"Car is creating ...\")     }          func printDescription() {         print(\"seats: \\(seats)\\nengine: \\(engine)\\ntripComputer: \\(tripComputer)\\ngps: \\(gps)\\n\")     } }<\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u0438\u0437\u0434\u0435\u043b\u0438\u0435, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043a  \u043d\u0435\u043c\u0443, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0432\u0441\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044f.<\/p>\n<pre><code class=\"swift\">final class Manual {     var seats = \"\"     var engine = \"\"     var tripComputer = \"\"     var gps = \"\"          init() {         print(\"Manual is creating ...\")     }          func printDescription() {         print(\"seats: \\(seats)\\nengine: \\(engine)\\ntripComputer: \\(tripComputer)\\ngps: \\(gps)\\n\")     } }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044c \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u043d\u0430\u0435\u0442 \u043a\u0430\u043a \u0438\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c, \u043d\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0432 \u043a\u0430\u043a\u0438\u0435 \u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435  \u0432\u0430\u0436\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.<\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f.<\/p>\n<pre><code class=\"swift\">protocol Builder {     func reset()     func setSeats(_ : Int)     func setEngine(_ : String)     func setTripComputer(_ : String)     func setGPS(_ : Bool) }<\/code><\/pre>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044f.<\/p>\n<pre><code class=\"swift\">final class CarBuilder: Builder {     private var car = Car()          \/\/ MARK: - Protocol methods     func reset() {         car = Car()     }          func setSeats(_ seats: Int) {         car.seats = seats     }          func setEngine(_ engine: String) {         car.engine = engine     }          func setTripComputer(_ computer: String) {         car.tripComputer = computer     }          func setGPS(_ isSet: Bool) {         car.gps = isSet ? true : false     }          \/\/ MARK: - getResult method     func getResult() -&gt; Car {         return car     } }<\/code><\/pre>\n<p>\u0410 \u0442\u0430\u043a \u0436\u0435 \u043a\u043b\u0430\u0441\u0441 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438.<\/p>\n<pre><code class=\"swift\">final class ManualBuilder: Builder {     private var manual = Manual()          \/\/ MARK: - Protocol methods     func reset() {         manual = Manual()     }          func setSeats(_ seats: Int) {         let ending = seats == 1 ? \"seat\" : \"seats\"         manual.seats = \"Car has \\(seats) \\(ending)\"     }          func setEngine(_ engine: String) {         manual.engine = \"Car has \\(engine) engine\"     }          func setTripComputer(_ computer: String) {         manual.tripComputer = \"Car has \\(computer) computer\"     }          func setGPS(_ isSet: Bool) {         manual.gps = isSet ? \"GPS is set\" : \"There is no GPS\"     }          \/\/ MARK: - getResult method     func getResult() -&gt; Manual {         return manual     } }<\/code><\/pre>\n<p>\u0422\u0430\u043a \u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0430 \u0438 \u043f\u0440\u0435\u0434\u0430\u0442\u044c \u0435\u043c\u0443 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f\u043c\u0438.<\/p>\n<pre><code class=\"swift\">final class Director {     func constructSportsCar(builder: Builder) {         builder.reset()         builder.setSeats(2)         builder.setEngine(\"Honda\")         builder.setTripComputer(\"Apple\")         builder.setGPS(true)     } }<\/code><\/pre>\n<p>\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u0437\u0430\u0434\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432. \u041a\u043b\u0430\u0441\u0441 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440 \u0432 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0435 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u0435\u043d, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435. \u041d\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u0435\u0442 \u0432\u044b\u0437\u043e\u0432\u044b \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u0438 \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u043c \u043f\u043e\u043b\u0435\u0437\u0435\u043d.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044c \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u043a \u043d\u0435\u043c\u0443 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f\u043c\u0438.<\/p>\n<pre><code class=\"swift\">\/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0430 \u0438 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u0435\u0439 let director = Director() let carBuilder = CarBuilder() let manualBuilder = ManualBuilder()  \/\/ \u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432 \u043c\u0435\u0442\u043e\u0434 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u0442\u0440\u0438\u0442\u0435\u043b\u044f \u0430\u0432\u0442\u043e director.constructSportsCar(builder: carBuilder) let car = carBuilder.getResult() car.printDescription()  \/\/ \u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432 \u043c\u0435\u0442\u043e\u0434 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0430 \u0441\u0442\u0440\u0438\u0442\u0435\u043b\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 director.constructSportsCar(builder: manualBuilder) let manual = manualBuilder.getResult() manual.printDescription()<\/code><\/pre>\n<p>\u0412\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0435 \u043e\u0442 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0430, \u0430 \u043e\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u0438 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u0435\u0439 \u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432.<\/p>\n<pre><code class=\"swift\">let car = carBuilder.getResult()<\/code><\/pre>\n<h2>\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \/ Prototype<\/h2>\n<p><strong>\u041f\u0440\u043e\u0442\u043e\u0442\u0438\u043f<\/strong>\u00a0<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-462355","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/462355","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=462355"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/462355\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=462355"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=462355"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=462355"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}