{"id":4504,"date":"2023-05-16T10:27:41","date_gmt":"2023-05-16T09:27:41","guid":{"rendered":"https:\/\/gdksoftware.com\/?post_type=knowledge&#038;p=4504"},"modified":"2023-05-16T10:35:37","modified_gmt":"2023-05-16T09:35:37","slug":"spring4d-factory-pattern","status":"publish","type":"knowledge","link":"https:\/\/gdksoftware.com\/nl\/kennisbank\/spring4d-factory-pattern","title":{"rendered":"Spring4D factory pattern"},"content":{"rendered":"<div style=\"padding-top: 12px; padding-bottom: 12px;\">\n<p>Welke opties zijn er in het <strong>Spring4D<\/strong> framework die we niet kennen, maar die wel heel <strong>bruikbaar<\/strong> zijn? Nou, eigenlijk best veel. E\u00e9n van die dingen is het <strong>Factory Pattern<\/strong>. Het komt erg van pas als je het <a href=\"https:\/\/gdksoftware.com\/nl\/kennisbank\/solid-principles-in-delphi-2-the-open-closed-principle\">open\/closed principe<\/a> wilt toepassen. Je code wel open voor uitbreiding, maar gesloten voor aanpassing.<\/p>\n<p>Een klassiek voorbeeld is het werken met enumeraties of getallen die een bepaalde status aangeven. Er ontstaan dan al snel allerlei conditionele structuren die aangepast moeten worden zodra er een nieuwe status of waarde bijkomt. In onderstaande voorbeeld wordt afhankelijk van een factuurstatus bepaalde code uitgevoerd. Voor het opsplitsen van de code is het factory pattern toegepast.<\/p>\n<p>Dit is de definitie van de factuur en status:<\/p>\n<\/div>\n<div style=\"background: #ffffff; overflow: auto; width: auto; border: solid gray; border-width: .1em .1em .1em .8em; padding: .2em .6em;\">\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #000080; font-weight: bold;\">type<\/span>\r\n  <span style=\"color: #008800; font-style: italic;\">{$SCOPEDENUMS ON}<\/span>\r\n  TInvoiceStatus = (<span style=\"color: #000080; font-weight: bold;\">New<\/span>, Sent, Overdue, Paid);\r\n  <span style=\"color: #008800; font-style: italic;\">{$SCOPEDENUMS OFF}<\/span>\r\n\r\n  TInvoice = <span style=\"color: #000080; font-weight: bold;\">class<\/span>\r\n  <span style=\"color: #000080; font-weight: bold;\">public<\/span>\r\n    <span style=\"color: #000080; font-weight: bold;\">function<\/span> Status: TInvoiceStatus;\r\n  <span style=\"color: #000080; font-weight: bold;\">end<\/span>;\r\n<\/pre>\n<\/div>\n<div style=\"padding-top: 12px; padding-bottom: 12px;\">Om het factory pattern te gebruiken includen we de <strong>Spring.DesignPatterns<\/strong> unit.<br \/>\nVervolgens defini\u00ebren we de factory. Die bestaat uit een key value en een functie waarmee je de methode teruggeeft die je uit wilt voeren. Dat klinkt complex, maar valt wel mee. In ons geval is de key value de factuurstatus (TInvoiceStatus). De functie die we uit willen voeren heeft een factuur (TInvoice) als parameter. De definitie voor de factory ziet er dan zo uit:<\/div>\n<div style=\"background: #ffffff; overflow: auto; width: auto; border: solid gray; border-width: .1em .1em .1em .8em; padding: .2em .6em;\">\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #000080; font-weight: bold;\">type<\/span>\r\n  TProcessInvoiceProc = reference <span style=\"color: #000080; font-weight: bold;\">to<\/span> <span style=\"color: #000080; font-weight: bold;\">procedure<\/span>(<span style=\"color: #000080; font-weight: bold;\">const<\/span> Invoice: TInvoice);\r\n\r\n  TInvoiceProcessor = <span style=\"color: #000080; font-weight: bold;\">class<\/span>\r\n  <span style=\"color: #000080; font-weight: bold;\">private<\/span>\r\n    FFactory: TFactory&lt;TInvoiceStatus, TProcessInvoiceProc &gt;;\r\n    <span style=\"color: #000080; font-weight: bold;\">procedure<\/span> InitialiseFactory;\r\n  <span style=\"color: #000080; font-weight: bold;\">end<\/span>;\r\n\r\n<span style=\"color: #000080; font-weight: bold;\">procedure<\/span> TInvoiceProcessor .InitialiseFactory;\r\n<span style=\"color: #000080; font-weight: bold;\">begin<\/span>\r\n  FFactory := TFactory&lt;TInvoiceStatus, TProcessInvoiceProc &gt;.Create;\r\n\r\n  FFactory.RegisterFactoryMethod(TInvoiceStatus.<span style=\"color: #000080; font-weight: bold;\">New<\/span>, ProcessInvoiceNew);\r\n  FFactory.RegisterFactoryMethod(TInvoiceStatus.Sent, ProcessInvoiceSent);\r\n  FFactory.RegisterFactoryMethod(TInvoiceStatus.Overdue, ProcessInvoiceOverdue);\r\n  FFactory.RegisterFactoryMethod(TInvoiceStatus.Paid, ProcessInvoicePaid);\r\n<span style=\"color: #000080; font-weight: bold;\">end<\/span>;\r\n<\/pre>\n<\/div>\n<div style=\"padding-top: 12px; padding-bottom: 12px;\">In bovenstaande code is al te zien hoe de factory aangemaakt en ge\u00efnitialiseerd wordt. Aan iedere status is een &#8220;Process&#8221; functie gekoppeld. Deze functie geeft de definitie van de TProcessInvoiceProc terug, om de code voor die status uit te kunnen voeren. Dat definieer je als volgt:<\/div>\n<div style=\"background: #ffffff; overflow: auto; width: auto; border: solid gray; border-width: .1em .1em .1em .8em; padding: .2em .6em;\">\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #000080; font-weight: bold;\">function<\/span> TInvoiceProcessor .ProcessInvoiceNew: TProcessInvoiceProc;\r\n<span style=\"color: #000080; font-weight: bold;\">begin<\/span>\r\n  Result := <span style=\"color: #000080; font-weight: bold;\">procedure<\/span>(<span style=\"color: #000080; font-weight: bold;\">const<\/span> Invoice: TInvoice)\r\n            <span style=\"color: #000080; font-weight: bold;\">begin<\/span>\r\n              ShowMessage(<span style=\"color: #0000ff;\">'This is a new invoice'<\/span>);\r\n            <span style=\"color: #000080; font-weight: bold;\">end<\/span>\r\n<span style=\"color: #000080; font-weight: bold;\">end<\/span>;\r\n<\/pre>\n<\/div>\n<div style=\"padding-top: 12px; padding-bottom: 12px;\">\n<p>Het toepassen van de factory is dan eenvoudig en gaat zoals zichtbaar in onderstaande code:<\/p>\n<\/div>\n<div style=\"background: #ffffff; overflow: auto; width: auto; border: solid gray; border-width: .1em .1em .1em .8em; padding: .2em .6em;\">\n<pre style=\"margin: 0; line-height: 125%;\"><span style=\"color: #000080; font-weight: bold;\">procedure<\/span> TInvoiceProcessor .ProcessInvoice(<span style=\"color: #000080; font-weight: bold;\">const<\/span> Invoice: TInvoice);\r\n<span style=\"color: #000080; font-weight: bold;\">begin<\/span>\r\n  <span style=\"color: #000080; font-weight: bold;\">if<\/span> FFactory.IsRegistered(Invoice.Status) <span style=\"color: #000080; font-weight: bold;\">then<\/span>\r\n  <span style=\"color: #000080; font-weight: bold;\">begin<\/span>\r\n    <span style=\"color: #000080; font-weight: bold;\">var<\/span> Process := FFactory.GetInstance(Invoice.Status;)\r\n    Process(Invoice);\r\n  <span style=\"color: #000080; font-weight: bold;\">end<\/span>;\r\n<span style=\"color: #000080; font-weight: bold;\">end<\/span>;\r\n<\/pre>\n<\/div>\n<div style=\"padding-top: 12px; padding-bottom: 12px;\">Op deze manier is met behulp van het factory pattern je code eenvoudig te splitsen en te verbeteren.<\/div>\n","protected":false},"featured_media":0,"parent":0,"template":"","class_list":["post-4504","knowledge","type-knowledge","status-publish","hentry","knowledge-category-delphi"],"acf":{"author":413,"type_hero":"compact","hero_image":4500,"hero_image_position":"","hero_title":"Spring4D factory pattern","hero_content":"","hero_link":null,"hero_show_h1":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.8 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Spring4D factory pattern - GDK Software<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gdksoftware.com\/nl\/kennisbank\/spring4d-factory-pattern\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring4D factory pattern\" \/>\n<meta property=\"og:description\" content=\"Welke opties zijn er in het Spring4D framework die we niet kennen, maar die wel heel bruikbaar zijn? Nou, eigenlijk best veel. E\u00e9n van die dingen is het Factory Pattern. Het komt erg van pas als je het open\/closed principe wilt toepassen. Je code wel open voor uitbreiding, maar gesloten voor aanpassing. Een klassiek voorbeeld [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gdksoftware.com\/nl\/kennisbank\/spring4d-factory-pattern\" \/>\n<meta property=\"og:site_name\" content=\"GDK Software\" \/>\n<meta property=\"article:modified_time\" content=\"2023-05-16T09:35:37+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/spring4d-factory-pattern\",\"url\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/spring4d-factory-pattern\",\"name\":\"Spring4D factory pattern - GDK Software\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl#website\"},\"datePublished\":\"2023-05-16T09:27:41+00:00\",\"dateModified\":\"2023-05-16T09:35:37+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/spring4d-factory-pattern#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/spring4d-factory-pattern\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/spring4d-factory-pattern#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gdksoftware.com\\\/nl\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Knowledgebase\",\"item\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Delphi\",\"item\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank-categorie\\\/delphi\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Spring4D factory pattern\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl#website\",\"url\":\"https:\\\/\\\/gdksoftware.com\\\/nl\",\"name\":\"GDK Software\",\"description\":\"Zet de stip op je horizon\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gdksoftware.com\\\/nl?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Spring4D factory pattern - GDK Software","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gdksoftware.com\/nl\/kennisbank\/spring4d-factory-pattern","og_locale":"nl_NL","og_type":"article","og_title":"Spring4D factory pattern","og_description":"Welke opties zijn er in het Spring4D framework die we niet kennen, maar die wel heel bruikbaar zijn? Nou, eigenlijk best veel. E\u00e9n van die dingen is het Factory Pattern. Het komt erg van pas als je het open\/closed principe wilt toepassen. Je code wel open voor uitbreiding, maar gesloten voor aanpassing. Een klassiek voorbeeld [&hellip;]","og_url":"https:\/\/gdksoftware.com\/nl\/kennisbank\/spring4d-factory-pattern","og_site_name":"GDK Software","article_modified_time":"2023-05-16T09:35:37+00:00","twitter_card":"summary_large_image","twitter_misc":{"Geschatte leestijd":"2 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/gdksoftware.com\/nl\/kennisbank\/spring4d-factory-pattern","url":"https:\/\/gdksoftware.com\/nl\/kennisbank\/spring4d-factory-pattern","name":"Spring4D factory pattern - GDK Software","isPartOf":{"@id":"https:\/\/gdksoftware.com\/nl#website"},"datePublished":"2023-05-16T09:27:41+00:00","dateModified":"2023-05-16T09:35:37+00:00","breadcrumb":{"@id":"https:\/\/gdksoftware.com\/nl\/kennisbank\/spring4d-factory-pattern#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gdksoftware.com\/nl\/kennisbank\/spring4d-factory-pattern"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/gdksoftware.com\/nl\/kennisbank\/spring4d-factory-pattern#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gdksoftware.com\/nl"},{"@type":"ListItem","position":2,"name":"Knowledgebase","item":"https:\/\/gdksoftware.com\/nl\/kennisbank"},{"@type":"ListItem","position":3,"name":"Delphi","item":"https:\/\/gdksoftware.com\/nl\/kennisbank-categorie\/delphi"},{"@type":"ListItem","position":4,"name":"Spring4D factory pattern"}]},{"@type":"WebSite","@id":"https:\/\/gdksoftware.com\/nl#website","url":"https:\/\/gdksoftware.com\/nl","name":"GDK Software","description":"Zet de stip op je horizon","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gdksoftware.com\/nl?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"}]}},"_links":{"self":[{"href":"https:\/\/gdksoftware.com\/nl\/wp-json\/wp\/v2\/knowledge\/4504","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gdksoftware.com\/nl\/wp-json\/wp\/v2\/knowledge"}],"about":[{"href":"https:\/\/gdksoftware.com\/nl\/wp-json\/wp\/v2\/types\/knowledge"}],"acf:post":[{"embeddable":true,"href":"https:\/\/gdksoftware.com\/nl\/wp-json\/wp\/v2\/team\/413"}],"wp:attachment":[{"href":"https:\/\/gdksoftware.com\/nl\/wp-json\/wp\/v2\/media?parent=4504"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}