<?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>Patrones creacionales</title>
	<atom:link href="https://samaniel.com/docs-category/desarrollo/patrones-de-diseno/patrones-creacionales/feed/" rel="self" type="application/rss+xml" />
	<link>https://samaniel.com</link>
	<description></description>
	<lastBuildDate>Tue, 10 Sep 2024 12:21:10 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.1</generator>
	<item>
		<title>Patrón Singleton</title>
		<link>https://samaniel.com/docs/patron-singleton/</link>
		
		<dc:creator><![CDATA[Samaniel]]></dc:creator>
		<pubDate>Wed, 04 Sep 2024 12:46:56 +0000</pubDate>
				<guid isPermaLink="false">https://samaniel.com/?post_type=docs&#038;p=361</guid>

					<description><![CDATA[El patrón Singleton es un patrón de diseño que garantiza que una clase tenga una única instancia y proporciona un [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>El patrón Singleton es un patrón de diseño que garantiza que una clase tenga una única instancia y proporciona un punto de acceso global a esa instancia. Este patrón es útil cuando solo debe existir una única instancia de una clase en toda la aplicación, como en el caso de la configuración de una aplicación o una conexión a la base de datos, o por ejemplo un servicio único en Spring Boot.</p>



<p></p>



<h3 class="wp-block-heading">Multihilo</h3>



<p>Es importante notar que, en un entorno multihilo, cada thread podría obtener una nueva instancia. Para asegurarse de que la operación sea thread safe, se deberá utilizar «syncronized».</p>



<p></p>



<h3 class="wp-block-heading">Ejemplo de Singleton en Java</h3>



<p>En general,  hay 3 condiciones:</p>



<p>Se puede inicializar de dos maneras, Lazy o Eager. </p>



<ul class="wp-block-list">
<li>Hacer privado el constructor</li>



<li>Asegurarse de que la variable con la instancia sea static</li>



<li>Proveer un método public static</li>
</ul>



<p>A continuación un ejemplo de cada una.</p>



<h4 class="wp-block-heading">Singleton con Lazy Initialization</h4>



<p>En este caso, la instancia de la clase Singleton se crea solo cuando es requerida, es decir, cuando se llama al método <code>getInstance()</code> por primera vez. Esto puede ser útil si la creación de la instancia es costosa en términos de recursos o tiempo.</p>



<pre class="wp-block-code"><code>public class SingletonLazy {

    // Instancia única de la clase, inicialmente nula
    private static SingletonLazy instancia;

    // Constructor privado para evitar instanciación desde fuera
    private SingletonLazy() {
        // Inicialización de recursos si es necesario
    }

    // Método público para obtener la instancia única de la clase
    public static SingletonLazy getInstance() {
        if (instancia == null) {
            instancia = new SingletonLazy();
        }
        return instancia;
    }

    // Método de ejemplo en la clase Singleton
    public void mostrarMensaje() {
        System.out.println("Hola desde Singleton con Lazy Initialization!");
    }
}</code></pre>



<p><strong>Uso del Singleton con Lazy Initialization:</strong></p>



<pre class="wp-block-code"><code>public class Main {
    public static void main(String&#91;] args) {
        SingletonLazy singleton = SingletonLazy.getInstance();
        singleton.mostrarMensaje();
    }
}</code></pre>



<p>En este ejemplo, la instancia de <code>SingletonLazy</code> solo se crea cuando se llama al método <code>getInstance()</code> por primera vez. Si el método nunca es llamado, la instancia nunca se crea.</p>



<h4 class="wp-block-heading">Singleton con Eager Initialization</h4>



<p>En el caso de <strong>Eager Initialization</strong>, la instancia de la clase Singleton se crea en el momento en que se carga la clase. Esto asegura que la instancia esté disponible inmediatamente, pero también significa que se creará incluso si nunca se utiliza, lo que puede ser un desperdicio de recursos en algunos casos.</p>



<pre class="wp-block-code"><code>public class SingletonEager {

    // Instancia única de la clase, creada al cargar la clase
    private static final SingletonEager instancia = new SingletonEager();

    // Constructor privado para evitar instanciación desde fuera
    private SingletonEager() {
        // Inicialización de recursos si es necesario
    }

    // Método público para obtener la instancia única de la clase
    public static SingletonEager getInstance() {
        return instancia;
    }

    // Método de ejemplo en la clase Singleton
    public void mostrarMensaje() {
        System.out.println("Hola desde Singleton con Eager Initialization!");
    }
}</code></pre>



<p><strong>Uso del Singleton con Eager Initialization:</strong></p>



<pre class="wp-block-code"><code>public class Main {
    public static void main(String&#91;] args) {
        SingletonEager singleton = SingletonEager.getInstance();
        singleton.mostrarMensaje();
    }
}</code></pre>



<p>En este ejemplo, la instancia de <code>SingletonEager</code> se crea en el momento en que la clase es cargada por el JVM, incluso si nunca se utiliza. Esto asegura que la instancia esté disponible inmediatamente, pero podría ser ineficiente si la instancia nunca es necesaria.</p>



<h4 class="wp-block-heading">Conclusión</h4>



<ul class="wp-block-list">
<li><strong>Lazy Initialization</strong>: La instancia se crea solo cuando es necesario, lo que puede ahorrar recursos si la instancia no siempre se usa.</li>



<li><strong>Eager Initialization</strong>: La instancia se crea tan pronto como se carga la clase, lo que asegura que esté disponible de inmediato, pero puede ser menos eficiente si la instancia no es utilizada.</li>
</ul>



<p></p>



<h3 class="wp-block-heading">Ejemplo de Singleton en Spring Boot</h3>



<p>En Spring Boot, el patrón Singleton es implementado por defecto en los beans de Spring, ya que los beans son Singleton por defecto. Aquí tienes un ejemplo simple:</p>



<pre class="wp-block-code"><code>import org.springframework.stereotype.Service;

@Service
public class SingletonService {

    // Método de ejemplo en el bean Singleton
    public void mostrarMensaje() {
        System.out.println("Hola desde Singleton en Spring Boot!");
    }
}</code></pre>



<p><strong>Uso del Singleton en Spring Boot:</strong></p>



<pre class="wp-block-code"><code>import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication implements CommandLineRunner {

    @Autowired
    private SingletonService singletonService;

    public static void main(String&#91;] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        singletonService.mostrarMensaje();
    }
}</code></pre>



<p>En este ejemplo:</p>



<ul class="wp-block-list">
<li>La clase <code>SingletonService</code> es un bean administrado por Spring.</li>



<li>La anotación <code>@Service</code> indica que esta clase es un servicio de Spring, y Spring la manejará como un Singleton.</li>



<li>En la clase principal <code>DemoApplication</code>, el <code>SingletonService</code> se inyecta utilizando <code>@Autowired</code>, asegurando que la misma instancia se utiliza en todo el ciclo de vida de la aplicación.</li>
</ul>



<h3 class="wp-block-heading">Conclusión</h3>



<p>El patrón Singleton es ampliamente utilizado cuando se necesita garantizar que una clase tenga una única instancia en toda la aplicación. En Java puro, se implementa de forma explícita, mientras que en Spring Boot, los beans ya son Singleton por defecto, lo que simplifica su uso y gestión.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Patrón Builder</title>
		<link>https://samaniel.com/docs/patron-builder/</link>
		
		<dc:creator><![CDATA[Samaniel]]></dc:creator>
		<pubDate>Tue, 03 Sep 2024 14:46:25 +0000</pubDate>
				<guid isPermaLink="false">https://samaniel.com/?post_type=docs&#038;p=328</guid>

					<description><![CDATA[El patrón de diseño&#160;Builder&#160;es un patrón creacional que se utiliza para construir objetos complejos de manera controlada y paso a [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>El patrón de diseño&nbsp;<strong>Builder</strong>&nbsp;es un patrón creacional que se utiliza para construir objetos complejos de manera controlada y paso a paso. A diferencia de otros patrones de creación, el Builder separa la construcción del objeto de su representación, lo que permite crear diferentes representaciones de un objeto utilizando el mismo proceso de construcción. Este patrón es especialmente útil cuando un objeto puede tener múltiples configuraciones o cuando su construcción implica varios pasos que deben seguir un orden específico.</p>



<h3 class="wp-block-heading">¿Cómo Funciona el Patrón Builder?</h3>



<p>El patrón Builder se estructura generalmente en cuatro componentes clave:</p>



<ol class="wp-block-list">
<li><strong>Producto (Product)</strong>: El objeto complejo que se va a construir.</li>



<li><strong>Builder</strong>: Una interfaz que define los métodos necesarios para construir las partes del Producto.</li>



<li><strong>Concrete Builder</strong>: Implementa la interfaz Builder y construye la representación concreta del Producto.Imaginemos que estamos construyendo una pizza con diferentes configuraciones, como Pizza Margarita y Pizza Pepperoni. Aquí se muestra cómo implementar el patrón Builder en Java para este caso:</li>



<li><strong>Director</strong>: Controla el proceso de construcción, orquestando el orden en que se invocan los métodos del Builder.</li>
</ol>



<h3 class="wp-block-heading">Ejemplo Práctico: Construcción de una Pizza</h3>



<p>Imaginemos que estamos construyendo una pizza con diferentes configuraciones, como Pizza Margarita y Pizza Pepperoni. Aquí se muestra cómo implementar el patrón Builder en Java para este caso:</p>



<p>Ventajas del uso de @Builder en Lombok:<br>Código más limpio y legible: No es necesario implementar manualmente el constructor, métodos setters o getters. Lombok se encarga de generar todo eso.<br>Inmutabilidad: Los objetos creados con el patrón Builder suelen ser inmutables, lo que aumenta la seguridad y consistencia en la gestión de datos.<br>Fluidez en la creación de objetos: Permite la creación de objetos de manera fluida, estableciendo solo los valores necesarios.</p>



<h4 class="wp-block-heading">Explicación del Ejemplo</h4>



<p>En este ejemplo, hemos construido una&nbsp;<strong>Pizza</strong>&nbsp;utilizando el patrón Builder.</p>



<ul class="wp-block-list">
<li><strong>Producto</strong>: La clase&nbsp;<code>Pizza</code>&nbsp;representa el objeto complejo que queremos construir.</li>



<li><strong>Builder</strong>: La interfaz&nbsp;<code>PizzaBuilder</code>&nbsp;define los pasos necesarios para construir una pizza, como&nbsp;<code>setMasa</code>,&nbsp;<code>setSalsa</code>&nbsp;y&nbsp;<code>setIngredientes</code>.</li>



<li><strong>Concrete Builder</strong>: La clase&nbsp;<code>PizzaMargaritaBuilder</code>&nbsp;implementa la interfaz&nbsp;<code>PizzaBuilder</code>&nbsp;y construye una pizza específica, en este caso, una&nbsp;<strong>Pizza Margarita</strong>.</li>



<li><strong>Director</strong>: La clase <code>PizzaDirector</code> controla el proceso de construcción. En el método <code>makeMargarita</code>, se define cómo se construye una Pizza Margarita paso a paso.</li>
</ul>



<p>El patrón <strong>Builder</strong> es un patrón de diseño creacional que permite construir objetos complejos paso a paso, proporcionando una interfaz fluida y flexible para configurar las propiedades de un objeto antes de su construcción final. Esto es particularmente útil cuando un objeto tiene muchos parámetros opcionales o configuraciones complejas, evitando la creación de múltiples constructores o un código con parámetros largos.</p>



<h3 class="wp-block-heading">Implementación del patrón Builder con <strong>Lombok</strong></h3>



<p><strong>Lombok</strong> es una biblioteca para Java que reduce el código repetitivo mediante anotaciones. En el caso del patrón Builder, Lombok proporciona la anotación <code>@Builder</code>, la cual simplifica la implementación de este patrón al generar automáticamente el código necesario.</p>



<h4 class="wp-block-heading">Ejemplo de uso del patrón Builder con Lombok</h4>



<pre class="wp-block-code"><code>import lombok.Builder;
import lombok.ToString;

@Builder
@ToString
public class Persona {
    private String nombre;
    private int edad;
    private String direccion;
}</code></pre>



<h4 class="wp-block-heading">Creación de un objeto con el patrón Builder</h4>



<pre class="wp-block-code"><code>public class Main {
    public static void main(String&#91;] args) {
        Persona persona = Persona.builder()
                                .nombre("Juan")
                                .edad(30)
                                .direccion("Calle Falsa 123")
                                .build();
    }
}</code></pre>



<h4 class="wp-block-heading">Explicación</h4>



<ul class="wp-block-list">
<li>La anotación <code>@Builder</code> genera un <strong>builder</strong> para la clase <code>Persona</code>, permitiendo construir objetos con una sintaxis fluida.</li>



<li>La anotación <code>@ToString</code> genera automáticamente el método <code>toString()</code>, que facilita la impresión de los valores del objeto.</li>
</ul>



<p></p>



<h3 class="wp-block-heading">Beneficios del Patrón Builder</h3>



<ul class="wp-block-list">
<li><strong>Flexibilidad</strong>: Puedes crear diferentes versiones de un objeto complejo usando el mismo código de construcción.</li>



<li><strong>Claridad</strong>: La separación de la construcción y la representación permite que el código sea más claro y manejable.</li>



<li><strong>Control</strong>: El Director garantiza que el objeto se construya de manera coherente y en el orden correcto</li>
</ul>



<p>Código disponible en&nbsp;<a href="https://github.com/samaniel/design-patterns">Github</a></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
