<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>singleton Archivi - Cesare Bordi | Innovation Manager &amp; Back-end Developer</title>
	<atom:link href="https://www.cesarebordi.it/tag/singleton/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.cesarebordi.it/tag/singleton/</link>
	<description>Innovare con soluzioni software efficaci e gioco di squadra</description>
	<lastBuildDate>Sat, 15 Apr 2023 10:44:24 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.2</generator>

<image>
	<url>https://www.cesarebordi.it/wp-content/uploads/2016/02/CB-logo-88x88.png</url>
	<title>singleton Archivi - Cesare Bordi | Innovation Manager &amp; Back-end Developer</title>
	<link>https://www.cesarebordi.it/tag/singleton/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Design Pattern Builder in Php</title>
		<link>https://www.cesarebordi.it/design-pattern-builder-php/</link>
					<comments>https://www.cesarebordi.it/design-pattern-builder-php/#respond</comments>
		
		<dc:creator><![CDATA[cesarebordi]]></dc:creator>
		<pubDate>Fri, 14 Apr 2023 18:07:24 +0000</pubDate>
				<category><![CDATA[Lezioni]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[classi]]></category>
		<category><![CDATA[contro]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[esempio]]></category>
		<category><![CDATA[guida]]></category>
		<category><![CDATA[metodo]]></category>
		<category><![CDATA[oggetti]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[pro]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[programmazione ad oggetti]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[singleton]]></category>
		<guid isPermaLink="false">https://www.cesarebordi.it/?p=1476</guid>

					<description><![CDATA[<p>Il builder è un design pattern creazionale molto utilizzato. Vediamo come implementarlo in php.</p>
<p>L'articolo <a href="https://www.cesarebordi.it/design-pattern-builder-php/">Design Pattern Builder in Php</a> sembra essere il primo su <a href="https://www.cesarebordi.it">Cesare Bordi | Innovation Manager &amp; Back-end Developer</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Il builder fa parte dei <a href="https://www.cesarebordi.it/design-pattern-gof-guida/" target="_blank" rel="noreferrer noopener">design pattern creazionali</a>, vediamo come <strong>implementarlo correttamente in PHP</strong> partendo dalla definizione data dalla <a href="https://it.wikipedia.org/wiki/Design_Patterns" target="_blank" rel="noreferrer noopener">Gang of Four</a> (GoF).</p>



<blockquote class="wp-block-quote">
<p>Il <strong>Builder pattern</strong> separa la costruzione di un oggetto complesso dalla sua rappresentazione, così che il processo di costruzione possa creare rappresentazioni diverse.</p>
</blockquote>



<p>Il design pattern Builder è un pattern creazionale che viene utilizzato per creare oggetti complessi step by step. Il suo obiettivo principale è quello di separare la costruzione di un oggetto complesso dalla sua rappresentazione, in modo che lo stesso processo di costruzione possa essere utilizzato per creare oggetti differenti.</p>



<p>Il pattern Builder prevede l&#8217;utilizzo dei seguenti elementi:</p>



<ul>
<li><strong>Oggetto Builder</strong> che viene utilizzato per definire le caratteristiche generali e comuni di oggetti omogenei.</li>



<li><strong>Metodi di &#8220;costruzione&#8221;</strong> che permettono di definire nello specifico l&#8217;oggetto finale passo dopo passo.</li>
</ul>



<h2 class="wp-block-heading">Scenari di utilizzo</h2>



<p>Il <strong>pattern Builder </strong>può essere utilizzato ovunque ci sia la necessità di creare oggetti complessi in modo flessibile e modulare, e dove i passaggi di costruzione possono essere suddivisi in metodi più piccoli e gestibili.</p>



<p>Esempi concreti di impiego possono essere:</p>



<ul>
<li><strong>Creazione di oggetti Model</strong>: Il pattern Builder può essere utilizzato per creare oggetti Model complessi passo dopo passo. Ad esempio, se si vuole creare un oggetto Model che rappresenta un Ordine con molti dettagli, il pattern Builder può semplificare il processo di creazione dell&#8217;oggetto suddividendo i passaggi in metodi più piccoli e gestibili.</li>



<li><strong>Costruzione di Query</strong>: Il pattern Builder può essere utilizzato per costruire query SQL complesse in modo flessibile e modulare.</li>



<li><strong>Creazione di oggetti View</strong>: Il pattern Builder può essere utilizzato per creare oggetti View complessi passo dopo passo. </li>
</ul>



<h2 class="wp-block-heading">Esempio di pattern Builder in PHP</h2>



<p>Vediamo ora un <strong>esempio di codice in PHP</strong> che utilizza il pattern <strong>Builder</strong> per creare una classe che funga da <strong>query builder SQL</strong>.</p>



<pre class="wp-block-prismatic-blocks"><code class="language-php">class QueryBuilder {
  private $table;
  private $fields = array();
  private $conditions = array();

  public function table($table) {
    $this-&gt;table = $table;
    return $this;
  }

  public function select($fields) {
    $this-&gt;fields = $fields;
    return $this;
  }

  public function where($field, $operator, $value) {
    $this-&gt;conditions[] = array(
      &#039;field&#039; =&gt; $field,
      &#039;operator&#039; =&gt; $operator,
      &#039;value&#039; =&gt; $value
    );
    return $this;
  }

  public function build() {
    $query = &#039;SELECT &#039; . implode(&#039;, &#039;, $this-&gt;fields) . &#039; FROM &#039; . $this-&gt;table;
    if (!empty($this-&gt;conditions)) {
      $query .= &#039; WHERE &#039;;
      foreach ($this-&gt;conditions as $condition) {
        $query .= $condition[&#039;field&#039;] . &#039; &#039; . $condition[&#039;operator&#039;] . &#039; &#039; . $condition[&#039;value&#039;] . &#039; AND &#039;;
      }
      $query = rtrim($query, &#039; AND &#039;);
    }
    return $query;
  }
}</code></pre>



<p>In questo esempio, la classe QueryBuilder definisce i metodi per creare una query SQL complessa passo dopo passo. Il metodo <code>table</code> imposta la tabella su cui effettuare la query, il metodo <code>select</code> imposta i campi da selezionare, e il metodo <code>where</code> aggiunge una condizione alla clausola WHERE della query. Infine, il metodo <code>build</code> restituisce la query SQL completa.</p>



<p>Vediamo ora come utilizzare il query builder appena creato:</p>



<pre class="wp-block-prismatic-blocks"><code class="language-php">$query = (new QueryBuilder())
          -&gt;table(&#039;products&#039;)
          -&gt;select(array(&#039;id&#039;, &#039;name&#039;, &#039;price&#039;))
          -&gt;where(&#039;price&#039;, &#039;&gt;&#039;, 10)
          -&gt;where(&#039;category&#039;, &#039;=&#039;, &#039;electronics&#039;)
          -&gt;build();
echo $query;
// Output: SELECT id, name, price FROM products WHERE price &gt; 10 AND category = &#039;electronics&#039;

</code></pre>



<p>Nell&#8217;esempio di utilizzo, si crea un oggetto QueryBuilder<strong> </strong>e si chiamano i metodi necessari per costruire la query desiderata, ovvero selezionare l&#8217;id, il nome e il prezzo dei prodotti con un prezzo maggiore di 10 e appartenenti alla categoria &#8216;electronics&#8217;. Infine, si chiama il metodo <code>build</code> per ottenere la query SQL completa.</p>



<h2 class="wp-block-heading">Vantaggi del design pattern builder</h2>



<ul>
<li>Consente di <strong>creare oggetti complessi</strong> step by step, separando la costruzione dell&#8217;oggetto dalla sua rappresentazione e facilitando il processo di creazione.</li>



<li>Permette di <strong>creare oggetti con diverse configurazioni</strong>, utilizzando gli stessi passaggi di costruzione.</li>



<li>Consente di <strong>creare oggetti in modo più flessibile e modulare</strong>, aggiungendo o rimuovendo passaggi di costruzione a seconda delle necessità.</li>



<li>Consente di <strong>migliorare la leggibilità del codice</strong>, in particolare quando si hanno molti parametri da passare al costruttore.</li>
</ul>



<h2 class="wp-block-heading">Svantaggi del design pattern builder</h2>



<ul>
<li>Può <strong>aumentare la complessità del codice</strong>, in particolare se si hanno molti passaggi di costruzione da definire.</li>



<li>Può <strong>richiedere l&#8217;implementazione di molte classi aggiuntive</strong> (interfacce e classi concrete).</li>



<li>Può <strong>introdurre un costo aggiuntivo di tempo di esecuzione</strong> a causa dell&#8217;utilizzo di oggetti intermedi durante il processo di costruzione.</li>
</ul>



<h2 class="wp-block-heading">Conclusioni</h2>



<p>Il pattern Builder è un pattern molto utile e flessibile per la creazione di oggetti complessi, ma deve essere utilizzato con cautela e valutando attentamente le specifiche esigenze del progetto.</p>



<p>Per un panoramica generale sui design pattern consiglio di leggere l&#8217;<a href="https://www.cesarebordi.it/design-pattern-gof-guida/">articolo introduttivo sui <strong>design patterns</strong></a>.</p>
<p>L'articolo <a href="https://www.cesarebordi.it/design-pattern-builder-php/">Design Pattern Builder in Php</a> sembra essere il primo su <a href="https://www.cesarebordi.it">Cesare Bordi | Innovation Manager &amp; Back-end Developer</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cesarebordi.it/design-pattern-builder-php/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Design Pattern Singleton in Php</title>
		<link>https://www.cesarebordi.it/design-pattern-singleton-php/</link>
					<comments>https://www.cesarebordi.it/design-pattern-singleton-php/#respond</comments>
		
		<dc:creator><![CDATA[cesarebordi]]></dc:creator>
		<pubDate>Thu, 21 May 2020 13:11:22 +0000</pubDate>
				<category><![CDATA[Lezioni]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[classi]]></category>
		<category><![CDATA[contro]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[esempio]]></category>
		<category><![CDATA[guida]]></category>
		<category><![CDATA[metodo]]></category>
		<category><![CDATA[oggetti]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[pro]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[programmazione ad oggetti]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[singleton]]></category>
		<guid isPermaLink="false">https://www.cesarebordi.it/?p=962</guid>

					<description><![CDATA[<p>Il singleton è il più conosciuto tra i design pattern creazionali. Vediamo come implementarlo in php e come usarlo nella programmazione ad oggetti (OOP).</p>
<p>L'articolo <a href="https://www.cesarebordi.it/design-pattern-singleton-php/">Design Pattern Singleton in Php</a> sembra essere il primo su <a href="https://www.cesarebordi.it">Cesare Bordi | Innovation Manager &amp; Back-end Developer</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Il <strong>singleton</strong> è tra i <a rel="noreferrer noopener" href="https://www.cesarebordi.it/design-pattern-gof-guida/" target="_blank">design pattern creazionali</a> più conosciuti e sul suo utilizzo nella <strong>programmazione ad oggetti</strong> (<strong>OOP</strong>) ci sono pareri contrastanti. Vediamo come <strong>implementarlo correttamente in PHP</strong> partendo dalla definizione data dalla <a rel="noreferrer noopener" href="https://it.wikipedia.org/wiki/Design_Patterns" target="_blank">Gang of Four</a> (GoF).</p>



<blockquote class="wp-block-quote">
<p>Il <strong>Singleton pattern</strong> assicura che una sola istanza di una classe esista, fornendo un punto di accesso globale a tale istanza.</p>
</blockquote>



<p>Il <strong>pattern Singleton</strong> impedisce la creazione di più istanze di una classe garantendo che ne esista solo una e fornisce un modo per accedere a quell&#8217;istanza unica da qualsiasi parte dell&#8217;applicazione.</p>



<p>Il singleton prevede tre elementi fondamentali:</p>



<ul>
<li><strong>Costruttore privato</strong>: impedisce la creazione di istanze della classe dal di fuori della classe stessa.</li>



<li><strong>Variabile statica privata</strong>: mantiene l&#8217;istanza unica della classe. Deve essere privata per evitare che altri oggetti accedano ad essa direttamente.</li>



<li><strong>Metodo statico di accesso all&#8217;istanza</strong>: restituisce l&#8217;istanza unica della classe. Se l&#8217;istanza non esiste ancora, il metodo crea l&#8217;istanza e la restituisce, altrimenti restituisce semplicemente l&#8217;istanza esistente.</li>
</ul>



<h2 class="wp-block-heading">Scenari di utilizzo</h2>



<p>Il <strong>pattern singleton</strong> può essere utilizzato quando un certo oggetto deve essere &#8220;unico&#8221; all&#8217;interno del nostro applicativo, per un ruolo di coordinamento o per ottimizzare le risorse. Ecco alcuni esempi concreti di utilizzo:</p>



<ul>
<li>Registro / Storage condiviso</li>



<li>Log / Debug</li>



<li>Connessione a DB persistente</li>
</ul>



<h2 class="wp-block-heading">Esempio di pattern Singleton in PHP</h2>



<p>Vediamo ora il codice di base per <strong>implementare</strong> questo pattern.</p>



<pre class="wp-block-prismatic-blocks"><code class="language-php">class MySingleton {

    /**
     * Istanza unica del singleton
     * @var object
     */
    private static object $instance;

    /**
     * Costruttore privato per prevenire che venga istanziato da codice esterno.
     */
    private function __construct() {
        echo &#039;Faccio qualcosa...&#039;;
    }

    /**
     * Metodo pubblico per l&#039;accesso all&#039;istanza unica di classe.
     * @return object|MySingleton
     */
    public static function getInstance() {
        if ( !isset(self::$instance) ) {
            self::$instance = new MySingleton();
        }
        return self::$instance;
    }
}</code></pre>



<p>Se proviamo ad istanziare due volte il singleton noteremo che il messaggio &#8220;Faccio qualcosa&#8230;&#8221; presente nel costruttore verrà mostrato una sola volta. poiché il sistema utilizzato per implementarlo garantisce l&#8217;unicità dell&#8217;istanza (oggetto).</p>



<pre class="wp-block-prismatic-blocks"><code class="language-"></code></pre>



<p>Per rendere il codice più riutilizzabile possiamo apportare una piccola modifica all&#8217;interno del metodo getIstance() in modo che il nome della classe istanziata con <em>new</em> sia valorizzato automaticamente. Sfruttiamo la <strong><a rel="noreferrer noopener" href="https://www.php.net/manual/en/language.constants.predefined.php" target="_blank">costante magica</a> __CLASS__</strong> che restituisce il nome della classe nella quale è richiamata.</p>



<pre class="wp-block-prismatic-blocks"><code class="language-php">if ( !isset(self::$instance) ) {
    $className = __CLASS__;
    self::$instance = new $className;
}</code></pre>



<h2 class="wp-block-heading">Vantaggi del design pattern singleton</h2>



<ul>
<li><strong>Garantisce una sola istanza:</strong> Il pattern Singleton garantisce che una sola istanza di una classe esista in un determinato momento, il che può essere utile in alcune situazioni, ad esempio per gestire le connessioni al database o le impostazioni globali dell&#8217;applicazione.</li>



<li><strong>Facile accesso globale:</strong> Il pattern Singleton fornisce un punto di accesso globale all&#8217;istanza unica, il che significa che possiamo accedere all&#8217;istanza ovunque e in qualsiasi momento senza dover preoccuparci di passare l&#8217;istanza esplicitamente a ogni parte dell&#8217;applicazione.</li>



<li><strong>Riduzione del consumo di memoria:</strong> Poiché una sola istanza esiste in un determinato momento, il pattern Singleton può aiutare a ridurre il consumo di memoria del sistema.</li>
</ul>



<h2 class="wp-block-heading">Svantaggi del design pattern singleton</h2>



<p>Alcuni puristi della programmazione ad oggetti (OOP) possono storcere il naso quando si parla di <strong>singleton</strong> definendolo un anti-pattern. Le principali critiche al singleton sono le seguenti:</p>



<p></p>



<ul>
<li><strong>Viola il Single Responsibility Principle</strong> (SRP) se crea delle dipendenze nei componenti che lo utilizzano. L&#8217;SRP vorrebbe infatti ogni componente assegnato ad una singola funzione o responsabilità.</li>



<li><strong></strong><strong>Difficile da testare</strong> poiché l&#8217;istanza unica esiste in tutta l&#8217;applicazione e non può essere facilmente sostituita con una mock o una versione di prova.</li>



<li><strong>Difficile da estendere</strong> poiché impone l&#8217;esistenza di una sola istanza di una classe in un determinato momento, può essere difficile estendere il pattern se si desidera introdurre più istanze della classe.</li>



<li><strong>Crea accoppiamento forte:</strong> poiché ogni parte dell&#8217;applicazione che utilizza il Singleton dipende dal suo stato globale.</li>



<li><strong>Viene utilizzato erroneamente per sostituire le variabili globali</strong> che, per definizione, non devono essere influenzate dall&#8217;applicativo.</li>
</ul>



<h2 class="wp-block-heading">Conclusioni</h2>



<p>Il singleton si può rivelare molto utile in specifiche situazioni, ma non bisogna abusarne così come non bisogna abusare delle implementazioni statiche nella programmazione ad oggetti. Può essere utile valutare anche altri tipi di soluzioni come la Dependency Injectiono il pattern Factory.</p>



<p>Per un panoramica generale consiglio di leggere l&#8217;<a href="https://www.cesarebordi.it/design-pattern-gof-guida/">articolo introduttivo sui <strong>design patterns</strong></a>.</p>
<p>L'articolo <a href="https://www.cesarebordi.it/design-pattern-singleton-php/">Design Pattern Singleton in Php</a> sembra essere il primo su <a href="https://www.cesarebordi.it">Cesare Bordi | Innovation Manager &amp; Back-end Developer</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cesarebordi.it/design-pattern-singleton-php/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
