{"id":26500,"date":"2024-03-19T15:29:43","date_gmt":"2024-03-19T14:29:43","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=26500"},"modified":"2024-03-19T15:36:06","modified_gmt":"2024-03-19T14:36:06","slug":"architettura-creativa-esplorando-i-pattern-di-progettazione","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/","title":{"rendered":"Architettura creativa: esplorando i pattern di progettazione"},"content":{"rendered":"\n<p>Abbiamo iniziato un viaggio per scoprire il modo migliore di strutturare il nostro codice ed evitare alcuni tipi di errori o di smells; questo viaggio continua con l&#8217;analisi dei design pattern organizzati per categoria.<\/p>\n\n\n\n<p><br>Quando si progetta un&#8217;applicazione, una delle fasi pi\u00f9 cruciali \u00e8 quella della progettazione e istanziazione delle classi. Questo \u00e8 dove <strong>entrano in gioco i design pattern creazionali<\/strong> i quali forniscono un modo efficace per gestire il processo di creazione di oggetti, fornendo allo sviluppatore un&#8217;astrazione dal processo di creazione, composizione e rappresentazione degli oggetti utilizzati.<\/p>\n\n\n\n<p><br>Analizziamo alcuni pattern cercando di comprendere il vantaggio di utilizzarli seguendo questo schema: scopo, vantaggi, esempio in Java con relativa spiegazione.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-abstract-factory\">Abstract factory<\/h4>\n\n\n\n<p>L&#8217;Abstract Factory \u00e8 un pattern creazionale che fornisce un&#8217;interfaccia per la creazione di famiglie di oggetti correlati o dipendenti senza specificarne le classi concrete. Questo permette di creare oggetti correlati senza dover conoscere le loro classi specifiche.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Vantaggi:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Incapsulamento delle famiglie di oggetti:<\/strong> L&#8217;Abstract Factory incapsula i dettagli di implementazione delle famiglie di oggetti, permettendo di modificare le famiglie di oggetti senza dover modificare il codice client.<\/li>\n\n\n\n<li><strong>Isolamento del codice client:<\/strong> Il client pu\u00f2 interagire con le famiglie di oggetti attraverso interfacce astratte, senza dover conoscere le implementazioni concrete.<\/li>\n<\/ul>\n\n\n\n<p>Di seguito un esempio: consideriamo una fabbrica di mobili che produca tavoli e sedie:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">\/\/ Interfaccia per i mobili<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">Furniture<\/span> <\/span>{\n    void assemble();\n}\n\n<span class=\"hljs-comment\">\/\/ Implementazione concreta di una sedia<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Chair<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">Furniture<\/span> <\/span>{\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> void assemble() {\n        System.out.println(<span class=\"hljs-string\">\"Assemblaggio di una sedia\"<\/span>);\n    }\n}\n\n<span class=\"hljs-comment\">\/\/ Implementazione concreta di un tavolo<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Table<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">Furniture<\/span> <\/span>{\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> void assemble() {\n        System.out.println(<span class=\"hljs-string\">\"Assemblaggio di un tavolo\"<\/span>);\n    }\n}\n\n<span class=\"hljs-comment\">\/\/ Interfaccia per la factory dei mobili<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">FurnitureFactory<\/span> <\/span>{\n    Furniture createFurniture();\n}\n\n<span class=\"hljs-comment\">\/\/ Factory per la creazione di sedie<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ChairFactory<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">FurnitureFactory<\/span> <\/span>{\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> Furniture createFurniture() {\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> Chair();\n    }\n}\n\n<span class=\"hljs-comment\">\/\/ Factory per la creazione di tavoli<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TableFactory<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">FurnitureFactory<\/span> <\/span>{\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> Furniture createFurniture() {\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> Table();\n    }\n}\n\n<span class=\"hljs-comment\">\/\/ Client che utilizza le factory per creare mobili<\/span>\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">UseFactoryExample<\/span> <\/span>{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> void main(String&#91;] args) {\n        FurnitureFactory chairFactory = <span class=\"hljs-keyword\">new<\/span> ChairFactory();\n        Furniture chair = chairFactory.createFurniture();\n        chair.assemble();\n\n        FurnitureFactory tableFactory = <span class=\"hljs-keyword\">new<\/span> TableFactory();\n        Furniture table = tableFactory.createFurniture();\n        table.assemble();\n    }\n}\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In questo esempio, abbiamo un&#8217;interfaccia <strong><em>Furniture<\/em><\/strong> che definisce un metodo <strong><em>assemble()<\/em><\/strong> comune per tutti i tipi di mobili. <br>Le classi concrete <strong><em>Chair<\/em><\/strong> e <strong><em>Table<\/em><\/strong> implementano questa interfaccia e forniscono l&#8217;implementazione specifica per il metodo <strong><em>assemble()<\/em><\/strong>. <br>Successivamente, abbiamo un&#8217;interfaccia <strong><em>FurnitureFactory<\/em><\/strong> che dichiara un metodo <strong><em>createFurniture()<\/em><\/strong> per la creazione di mobili; le classi concrete <strong><em>ChairFactory<\/em><\/strong> e <strong><em>TableFactory<\/em><\/strong> implementano questa interfaccia e forniscono l&#8217;implementazione per creare istanze specifiche di sedie e tavoli. <br>Infine, nel metodo<strong><em> main()<\/em><\/strong> della classe <strong><em>UseFactoryExample<\/em><\/strong>, utilizziamo le factory per creare istanze di sedie e tavoli senza dover conoscere le classi concrete <strong><em>Chair<\/em><\/strong> e <strong><em>Table<\/em><\/strong>. <br>Questo ci consente di creare mobili in modo flessibile e senza dover modificare il codice client ogni volta che aggiungiamo nuovi tipi di mobili alla nostra applicazione.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/masterclass.codemotion.com\/\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/BANNER-MAGAZINE-1-1024x576.png\" alt=\"\" class=\"wp-image-26613\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/BANNER-MAGAZINE-1-1024x576.png 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/BANNER-MAGAZINE-1-300x169.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/BANNER-MAGAZINE-1-768x432.png 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/BANNER-MAGAZINE-1-1536x864.png 1536w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/BANNER-MAGAZINE-1-896x504.png 896w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/BANNER-MAGAZINE-1-400x225.png 400w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/03\/BANNER-MAGAZINE-1.png 1921w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-builder\">Builder<\/h4>\n\n\n\n<p>Il pattern Builder \u00e8 utile quando si desidera costruire oggetti complessi passo dopo passo, consentendo la creazione di diverse rappresentazioni dello stesso oggetto utilizzando lo stesso codice di costruzione.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Vantaggi:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Separazione della costruzione dall&#8217;oggetto finale:<\/strong> Il Builder separa il processo di costruzione dell&#8217;oggetto dal suo risultato finale, consentendo la creazione di oggetti complessi con un&#8217;interfaccia chiara.<\/li>\n\n\n\n<li><strong>Controllo preciso sulla costruzione:<\/strong> Il Builder permette di configurare un oggetto passo dopo passo, fornendo un controllo preciso sul processo di costruzione.<\/li>\n<\/ul>\n\n\n\n<p>Facciamo un esempio, consideriamo un costruttore di pizze:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">\/\/ Classe per rappresentare la pizza<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Pizza<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> String impasto;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">List<\/span>&lt;String&gt; ingredienti;\n\n    <span class=\"hljs-keyword\">public<\/span> Pizza() {\n       this.ingredienti = <span class=\"hljs-keyword\">new<\/span> ArrayList&lt;&gt;();\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> void setImpasto(String impasto) {\n        this.impasto = impasto;\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">List<\/span>&lt;String&gt; addIngrediente(String ingrediente) {\n        this.ingredienti.add(ingrediente);\n        <span class=\"hljs-keyword\">return<\/span> this.ingredienti;\n    }\n\n\n    <span class=\"hljs-keyword\">public<\/span> void showPizza() {\n        System.out.println(<span class=\"hljs-string\">\"Pizza con impasto: \"<\/span> + impasto + \n                           <span class=\"hljs-string\">\", ingredienti: \"<\/span> + ingredienti);\n    }\n}\n\n<span class=\"hljs-comment\">\/\/ Interfaccia per il builder della pizza<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">PizzaBuilder<\/span> <\/span>{\n    void buildImpasto();\n    void buildIngredienti();\n    Pizza getPizza();\n}\n\n<span class=\"hljs-comment\">\/\/ Implementazione concreta del builder per una pizza piccante<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">FourSeasonPizzaBuilder<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">PizzaBuilder<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> Pizza pizza;\n\n    <span class=\"hljs-keyword\">public<\/span> FourSeasonPizzaBuilder() {\n        this.pizza = <span class=\"hljs-keyword\">new<\/span> Pizza();\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> void buildImpasto() {\n        pizza.setImpasto(<span class=\"hljs-string\">\"Napoletano\"<\/span>);\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> void buildIngredienti() {\n        pizza.addIngrediente(<span class=\"hljs-string\">\"olive\"<\/span>);\n        pizza.addIngrediente(<span class=\"hljs-string\">\"carciofi\"<\/span>);\n        pizza.addIngrediente(<span class=\"hljs-string\">\"prosciutto\"<\/span>);\n        pizza.addIngrediente(<span class=\"hljs-string\">\"funghi\"<\/span>);\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> Pizza getPizza() {\n        <span class=\"hljs-keyword\">return<\/span> pizza;\n    }\n}\n\n<span class=\"hljs-comment\">\/\/ Direttore per gestire il processo di costruzione della pizza<\/span>\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">PizzaDirector<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> PizzaBuilder pizzaBuilder;\n\n    <span class=\"hljs-keyword\">public<\/span> void setPizzaBuilder(PizzaBuilder pizzaBuilder) {\n        this.pizzaBuilder = pizzaBuilder;\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> Pizza getPizza() {\n        <span class=\"hljs-keyword\">return<\/span> pizzaBuilder.getPizza();\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> void constructPizza() {\n        pizzaBuilder.buildImpasto();\n        pizzaBuilder.buildIngredienti();\n    }\n}\n\n<span class=\"hljs-comment\">\/\/ Cliente che utilizza il builder per creare una pizza<\/span>\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Pizzeria<\/span> <\/span>{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> void main(String&#91;] args) {\n        PizzaDirector director = <span class=\"hljs-keyword\">new<\/span> PizzaDirector();\n        PizzaBuilder fourSeasonPizzaBuilder = <span class=\"hljs-keyword\">new<\/span> FourSeasonPizzaBuilder();\n\n        director.setPizzaBuilder(fourSeasonPizzaBuilder);\n        director.constructPizza();\n\n        Pizza fSPizza = director.getPizza();\n        fSPizza.showPizza();\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In questo esempio abbiamo una classe <strong><em>Pizza<\/em><\/strong> che rappresenta una pizza e ha vari attributi come <strong><em>impasto<\/em><\/strong> e<strong><em> ingredienti<\/em><\/strong>. Abbiamo anche un&#8217;interfaccia <strong><em>PizzaBuilder<\/em><\/strong> che dichiara i metodi per costruire la pizza passo dopo passo. <br>La classe <strong><em>FourSeasonPizzaBuilder<\/em><\/strong> \u00e8 un&#8217;implementazione concreta dell&#8217;interfaccia <strong><em>PizzaBuilder<\/em><\/strong> e si occupa di costruire una pizza quattro stagioni con impasto napoletano, e gli ingredienti tipici della quattro stagioni. La classe <strong><em>PizzaDirector<\/em><\/strong> gestisce il processo di costruzione della pizza utilizzando il builder. Il client, nella classe <strong><em>Pizzeria<\/em><\/strong>, utilizza il <em>director<\/em> per specificare il tipo di pizza che desidera e quindi ottiene la pizza completata. Questo permette al client di creare una pizza personalizzata specificando solo gli ingredienti desiderati, senza dover gestire direttamente il processo di costruzione della pizza.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-singleton\">Singleton<\/h4>\n\n\n\n<p>Il pattern Singleton \u00e8 progettato per garantire che una classe abbia una sola istanza e fornire un punto di accesso globale a tale istanza. Questo significa che ogni volta che viene richiesta un&#8217;istanza della classe Singleton, viene restituita sempre la stessa istanza, evitando la creazione di nuove istanze.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-vantaggi\">Vantaggi:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Controllo sull&#8217;istanza<\/strong>: Il pattern Singleton offre un controllo completo sull&#8217;istanza della classe, garantendo che esista una sola istanza.<\/li>\n\n\n\n<li><strong>Risparmio di memoria<\/strong>: Evita sprechi di memoria poich\u00e9 viene creata una sola istanza dell&#8217;oggetto e viene riutilizzata ogni volta che necessaria.<\/li>\n\n\n\n<li><strong>Accesso globale<\/strong>: Fornisce un punto di accesso globale all&#8217;istanza della classe Singleton, consentendo l&#8217;accesso da qualsiasi parte dell&#8217;applicazione.<\/li>\n<\/ul>\n\n\n\n<p>Facciamo un esempio di come si possa creare un singleton:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">\/\/ Classe Singleton per il gestore delle connessioni al database<\/span>\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">DatabaseConnectionManager<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> DatabaseConnectionManager instance;\n    <span class=\"hljs-keyword\">private<\/span> Connection connection;\n\n    <span class=\"hljs-comment\">\/\/ Costruttore privato<\/span>\n    <span class=\"hljs-keyword\">private<\/span> DatabaseConnectionManager() {\n        <span class=\"hljs-comment\">\/\/ Inizializzazione della connessione al database<\/span>\n        <span class=\"hljs-comment\">\/\/ ...<\/span>\n    }\n\n    <span class=\"hljs-comment\">\/\/ Metodo statico per ottenere l'istanza Singleton<\/span>\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> synchronized DatabaseConnectionManager getInstance() {\n        <span class=\"hljs-keyword\">if<\/span> (instance == <span class=\"hljs-keyword\">null<\/span>) {\n            instance = <span class=\"hljs-keyword\">new<\/span> DatabaseConnectionManager();\n        }\n        <span class=\"hljs-keyword\">return<\/span> instance;\n    }\n\n    <span class=\"hljs-comment\">\/\/ Metodo per ottenere la connessione al database<\/span>\n    <span class=\"hljs-keyword\">public<\/span> Connection getConnection() {\n        <span class=\"hljs-comment\">\/\/ Restituisci la connessione<\/span>\n        <span class=\"hljs-keyword\">return<\/span> connection;\n    }\n\n    <span class=\"hljs-comment\">\/\/ Altri metodi per gestire le connessioni al database<\/span>\n    <span class=\"hljs-comment\">\/\/ ...<\/span>\n}\n\n<span class=\"hljs-comment\">\/\/ Classe principale per il test del Singleton del gestore delle connessioni al database<\/span>\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Main<\/span> <\/span>{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> void main(String&#91;] args) {\n        <span class=\"hljs-comment\">\/\/ Ottenere l'istanza Singleton del gestore delle connessioni al database<\/span>\n        DatabaseConnectionManager dbManager1 = \n                            DatabaseConnectionManager.getInstance();\n        DatabaseConnectionManager dbManager2 = \n                            DatabaseConnectionManager.getInstance();\n\n        <span class=\"hljs-comment\">\/\/ Verifica se le due istanze sono uguali<\/span>\n        <span class=\"hljs-keyword\">if<\/span> (dbManager1 == dbManager2) {\n            System.out.println(<span class=\"hljs-string\">\"Le due istanze del gestore delle \n                                connessioni al database sono uguali. \n                                Singleton funziona correttamente.\"<\/span>);\n        } <span class=\"hljs-keyword\">else<\/span> {\n            System.out.println(<span class=\"hljs-string\">\"Le due istanze del gestore delle \n                                connessioni al database non sono uguali. \n                                Qualcosa non va con Singleton.\"<\/span>);\n        }\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>L&#8217;esecuzione del codice sopra produce il seguente risultato<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Entrambi i riferimenti puntano alla stessa istanza del Singleton.\n<\/code><\/span><\/pre>\n\n\n<p>La classe <strong><em>DatabaseConnectionManager<\/em><\/strong> ha un costruttore privato per evitare che venga istanziata direttamente: il metodo <strong><em>getInstance()<\/em><\/strong> \u00e8 dichiarato come <strong><em>static<\/em><\/strong> e <strong><em>synchronized<\/em><\/strong> per garantire che solo un thread alla volta possa accedere al suo interno. Questo metodo restituisce sempre la stessa istanza di <strong><em>DatabaseConnectionManager<\/em><\/strong>, se l&#8217;istanza non \u00e8 stata ancora creata, viene istanziata e restituita, altrimenti viene restituita direttamente. Nel metodo <strong><em>main()<\/em><\/strong> della classe <strong><em>Main<\/em><\/strong>, otteniamo due istanze di <strong><em>DatabaseConnectionManager<\/em><\/strong> utilizzando il metodo <strong><em>getInstance()<\/em><\/strong>. Poich\u00e9 il Singleton garantisce che solo un&#8217;istanza della classe esista nell&#8217;applicazione, <strong><em>dbManager1<\/em><\/strong> e <strong><em>dbManager2<\/em><\/strong> saranno entrambe riferimenti alla stessa istanza, possiamo verificarlo confrontando i due riferimenti: se entrambi puntano alla stessa istanza, stampiamo un messaggio che conferma che il Singleton funziona correttamente. <br>In questo modo, il pattern Singleton garantisce che l&#8217;accesso al gestore delle connessioni al database sia centralizzato e che non ci siano pi\u00f9 istanze di questo gestore nell&#8217;applicazione. Questo \u00e8 utile per garantire l&#8217;efficienza delle risorse e mantenere la coerenza nella gestione delle connessioni al database.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/microservizi-cosa-sono\/\" target=\"_blank\" aria-label=\"Leggi anche: design pattern applicati ai microservizi (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\"><em><strong>Leggi anche: design pattern applicati ai microservizi<\/strong><\/em><\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-conclusioni\">Conclusioni<\/h4>\n\n\n\n<p>Ci sono altri design pattern creazionali, questo articolo ha uno scopo dimostrativo e non esaustivo di tutti i pattern e vuole fornire delle indicazioni esplicative per quanto riguarda i pattern spiegati qui dando modo di analizzare sia questi che gli altri pattern creazionali perch\u00e8 ha fornito degli strumenti di analisi: che cosa sono? come funzionano? come si possono usare?<br>Il viaggio verso la conoscenza dei pattern \u00e8 ancora lungo; nel prossimo articolo vedremo gli strutturali che hanno un altro scopo rispetto ai creazionali.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Abbiamo iniziato un viaggio per scoprire il modo migliore di strutturare il nostro codice ed evitare alcuni tipi di errori o di smells; questo viaggio continua con l&#8217;analisi dei design pattern organizzati per categoria. Quando si progetta un&#8217;applicazione, una delle fasi pi\u00f9 cruciali \u00e8 quella della progettazione e istanziazione delle classi. Questo \u00e8 dove entrano&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/\">Read more<\/a><\/p>\n","protected":false},"author":218,"featured_media":26219,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[10269,10263],"tags":[],"collections":[11809,11929,11927],"class_list":{"0":"post-26500","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-architettura-del-software","8":"category-backend-it","9":"collections-clean-code","10":"collections-designpattern","11":"collections-java","12":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Architettura creativa: esplorando i pattern di progettazione - Codemotion Magazine<\/title>\n<meta name=\"description\" content=\"Leggi l&#039;articolo per scoprire alcuni pattern di progettazione e i loro vantaggi.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Architettura creativa: esplorando i pattern di progettazione\" \/>\n<meta property=\"og:description\" content=\"Leggi l&#039;articolo per scoprire alcuni pattern di progettazione e i loro vantaggi.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/\" \/>\n<meta property=\"og:site_name\" content=\"Codemotion Magazine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Codemotion.Italy\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-03-19T14:29:43+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-03-19T14:36:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1792\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"peduz91\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@peduz91\" \/>\n<meta name=\"twitter:site\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"peduz91\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/\"},\"author\":{\"name\":\"peduz91\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/452ca8d6219835e3b83660c0c86dfb98\"},\"headline\":\"Architettura creativa: esplorando i pattern di progettazione\",\"datePublished\":\"2024-03-19T14:29:43+00:00\",\"dateModified\":\"2024-03-19T14:36:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/\"},\"wordCount\":919,\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept.webp\",\"articleSection\":[\"Architettura del software\",\"Backend\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/\",\"name\":\"Architettura creativa: esplorando i pattern di progettazione - Codemotion Magazine\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept.webp\",\"datePublished\":\"2024-03-19T14:29:43+00:00\",\"dateModified\":\"2024-03-19T14:36:06+00:00\",\"description\":\"Leggi l'articolo per scoprire alcuni pattern di progettazione e i loro vantaggi.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/#primaryimage\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept.webp\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept.webp\",\"width\":1792,\"height\":1024,\"caption\":\"Software development design patterns. Soluzioni di software e coding con design patterns.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Backend\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Architettura creativa: esplorando i pattern di progettazione\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"name\":\"Codemotion Magazine\",\"description\":\"We code the future. Together\",\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\",\"name\":\"Codemotion\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"width\":225,\"height\":225,\"caption\":\"Codemotion\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Codemotion.Italy\/\",\"https:\/\/x.com\/CodemotionIT\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/452ca8d6219835e3b83660c0c86dfb98\",\"name\":\"peduz91\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/12\/gp-100x100.jpg\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/12\/gp-100x100.jpg\",\"caption\":\"peduz91\"},\"description\":\"I am a software developer with a strong passion for development, technology, soccer and chess. I always like to challenge myself, I often try new things. I think the most important thing is to work well with the team.\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/giuseppe-pedull-68ab8274\/\",\"https:\/\/x.com\/peduz91\"],\"url\":\"https:\/\/www.codemotion.com\/magazine\/author\/peduz91\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Architettura creativa: esplorando i pattern di progettazione - Codemotion Magazine","description":"Leggi l'articolo per scoprire alcuni pattern di progettazione e i loro vantaggi.","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:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/","og_locale":"en_US","og_type":"article","og_title":"Architettura creativa: esplorando i pattern di progettazione","og_description":"Leggi l'articolo per scoprire alcuni pattern di progettazione e i loro vantaggi.","og_url":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2024-03-19T14:29:43+00:00","article_modified_time":"2024-03-19T14:36:06+00:00","og_image":[{"width":1792,"height":1024,"url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept.webp","type":"image\/webp"}],"author":"peduz91","twitter_card":"summary_large_image","twitter_creator":"@peduz91","twitter_site":"@CodemotionIT","twitter_misc":{"Written by":"peduz91","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/"},"author":{"name":"peduz91","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/452ca8d6219835e3b83660c0c86dfb98"},"headline":"Architettura creativa: esplorando i pattern di progettazione","datePublished":"2024-03-19T14:29:43+00:00","dateModified":"2024-03-19T14:36:06+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/"},"wordCount":919,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept.webp","articleSection":["Architettura del software","Backend"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/","url":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/","name":"Architettura creativa: esplorando i pattern di progettazione - Codemotion Magazine","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept.webp","datePublished":"2024-03-19T14:29:43+00:00","dateModified":"2024-03-19T14:36:06+00:00","description":"Leggi l'articolo per scoprire alcuni pattern di progettazione e i loro vantaggi.","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/#primaryimage","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept.webp","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept.webp","width":1792,"height":1024,"caption":"Software development design patterns. Soluzioni di software e coding con design patterns."},{"@type":"BreadcrumbList","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/architettura-creativa-esplorando-i-pattern-di-progettazione\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codemotion.com\/magazine\/"},{"@type":"ListItem","position":2,"name":"Backend","item":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/"},{"@type":"ListItem","position":3,"name":"Architettura creativa: esplorando i pattern di progettazione"}]},{"@type":"WebSite","@id":"https:\/\/www.codemotion.com\/magazine\/#website","url":"https:\/\/www.codemotion.com\/magazine\/","name":"Codemotion Magazine","description":"We code the future. Together","publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codemotion.com\/magazine\/#organization","name":"Codemotion","url":"https:\/\/www.codemotion.com\/magazine\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","width":225,"height":225,"caption":"Codemotion"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Codemotion.Italy\/","https:\/\/x.com\/CodemotionIT"]},{"@type":"Person","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/452ca8d6219835e3b83660c0c86dfb98","name":"peduz91","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/12\/gp-100x100.jpg","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2023\/12\/gp-100x100.jpg","caption":"peduz91"},"description":"I am a software developer with a strong passion for development, technology, soccer and chess. I always like to challenge myself, I often try new things. I think the most important thing is to work well with the team.","sameAs":["https:\/\/www.linkedin.com\/in\/giuseppe-pedull-68ab8274\/","https:\/\/x.com\/peduz91"],"url":"https:\/\/www.codemotion.com\/magazine\/author\/peduz91\/"}]}},"featured_image_src":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept-600x400.webp","featured_image_src_square":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept-600x600.webp","author_info":{"display_name":"peduz91","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/peduz91\/"},"uagb_featured_image_src":{"full":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept.webp",1792,1024,false],"thumbnail":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept-150x150.webp",150,150,true],"medium":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept-300x171.webp",300,171,true],"medium_large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept-768x439.webp",768,439,true],"large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept-1024x585.webp",1024,585,true],"1536x1536":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept-1536x878.webp",1536,878,true],"2048x2048":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept.webp",1792,1024,false],"small-home-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept-100x100.webp",100,100,true],"sidebar-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept-180x128.webp",180,128,true],"genesis-singular-images":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept-896x504.webp",896,504,true],"archive-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept-400x225.webp",400,225,true],"gb-block-post-grid-landscape":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept-600x400.webp",600,400,true],"gb-block-post-grid-square":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/software-development-design-patterns-concept-600x600.webp",600,600,true]},"uagb_author_info":{"display_name":"peduz91","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/peduz91\/"},"uagb_comment_info":0,"uagb_excerpt":"Abbiamo iniziato un viaggio per scoprire il modo migliore di strutturare il nostro codice ed evitare alcuni tipi di errori o di smells; questo viaggio continua con l&#8217;analisi dei design pattern organizzati per categoria. Quando si progetta un&#8217;applicazione, una delle fasi pi\u00f9 cruciali \u00e8 quella della progettazione e istanziazione delle classi. Questo \u00e8 dove entrano&#8230;&hellip;","lang":"it","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/26500","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/users\/218"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/comments?post=26500"}],"version-history":[{"count":3,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/26500\/revisions"}],"predecessor-version":[{"id":26625,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/26500\/revisions\/26625"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media\/26219"}],"wp:attachment":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media?parent=26500"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=26500"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=26500"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=26500"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}