<?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/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>POO &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<atom:link href="https://www.oscarblancarteblog.com/tag/poo/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.oscarblancarteblog.com</link>
	<description>Software Architect &#38; FullStack developer</description>
	<lastBuildDate>Sun, 02 Aug 2020 22:45:20 +0000</lastBuildDate>
	<language>es-MX</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.12</generator>

<image>
	<url>https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/cropped-ob-32x32.png</url>
	<title>POO &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<link>https://www.oscarblancarteblog.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">89905023</site>	<item>
		<title>Java 8 – Interfaces funcionales</title>
		<link>https://www.oscarblancarteblog.com/2016/12/08/java-8-interfaces-funcionales/</link>
					<comments>https://www.oscarblancarteblog.com/2016/12/08/java-8-interfaces-funcionales/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 08 Dec 2016 09:00:10 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java8]]></category>
		<category><![CDATA[POO]]></category>
		<guid isPermaLink="false">http://www.oscarblancarteblog.com/?p=1279</guid>

					<description><![CDATA[<p>Se le conoce como interface funcional a toda aquella interface que tenga solamente un método abstracto, es decir puede implementar uno o más métodos default, pero deberá tener forzosamente un único método abstracto. Si no te queda claro que es un método abstracto en una interface, es un método sin implementar. Las interfaces funcionales es [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/12/08/java-8-interfaces-funcionales/">Java 8 – Interfaces funcionales</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="alignleft wp-image-1275 size-thumbnail" src="http://www.oscarblancarteblog.com/wp-content/uploads/2016/12/Duke_8-copy1-150x150.png" alt="Interfaces funcionales" width="150" height="150" />Se le conoce como interface funcional a toda aquella interface que tenga solamente un método abstracto, es decir puede implementar uno o más <u>métodos default</u>, pero deberá tener forzosamente un único método abstracto. Si no te queda claro que es un método abstracto en una interface, es un método sin implementar.</p>
<p>Las interfaces funcionales es un nuevo concepto que fue agregado a partir de la versión 8 de Java y cobran su importancia al utilizar expresiones lambda (λ).</p>
<h2></h2>
<h2>Ejemplo de interfaces funcionales:</h2>
<p>A continuación, veremos ejemplos de dos interfaces funcionales válidas:<span id="more-1279"></span></p>
<pre class="lang:java decode:true " title="IStrategy.java">package com.osb.functionalinterface;

/**
 * @author Oscar Blancarte 
 */
public interface IStrategy {
    public String sayHelloTo(String name);
}</pre>
<p>En esta interface, definimos un método que manda un saludo a la persona que le pasamos como parámetro, pero todavía no está definido el cuerpo del método.</p>
<pre class="lang:java decode:true " title="IStrategy.java">package com.osb.functionalinterface;

/**
 * @author Oscar Blancarte 
 */
public interface IStrategy {
    
    public String sayHelloTo(String name);
    
    public default String sayHelloWord(){
        return "Hello word";
    }
}</pre>
<p>Esta segunda interface, también es una interface funcional, ya que solo tiene un método abstracto.</p>
<p>Otra forma de asegurarnos de que estamos definiendo correctamente una interface funcional, es anotarla con <span class="lang:java decode:true crayon-inline ">@FunctionalInterface</span> , ya que al anotarla el IDE automáticamente nos arrojara un error si no cumplimos con las reglas de una interface funcional. Sin embargo, es importante resaltar que en tiempo de ejecución no nos dará un comportamiento diferente, puesto que es utilizada para prevenir errores al momento de definir las interfaces. Veamos cómo quedaría la clase anterior con esta anotación:</p>
<pre class="lang:java decode:true " title="IStrategy.java">package com.osb.functionalinterface;

/**
 * @author Oscar Blancarte 
 */
@FunctionalInterface
public interface IStrategy {
    
    public String sayHelloTo(String name);
    
    public default String sayHelloWord(){
        return "Hello word";
    }
}</pre>
<h2>Interfaces funcionales con expresiones lambda:</h2>
<p>Ya con la teoría, veamos cómo podría utilizar la clase <span class="lang:java decode:true crayon-inline ">IStrategy</span>  mediante expresiones lambda:</p>
<pre class="lang:java decode:true" title="Main.java">package com.osb.functionalinterface;

/**
 * @author Oscar Blancarte
 */
public class Main {
    public static void main(String[] args) {
        IStrategy strategy = (name) -&gt; "Hello " + name;
        
        System.out.println(strategy.sayHelloTo("Oscar Blancarte"));
        System.out.println(strategy.sayHelloWord());
    }
}</pre>
<p>Veamos como en la línea 8 definimos una expresión lamba en donde concatena <strong>Hello</strong> con el nombre de la persona que es pasada como parámetro, luego esta expresión es asignada a la variable a la variable <span class="lang:java decode:true crayon-inline ">strategy</span> , la cual es de tipo <span class="lang:java decode:true crayon-inline ">IStrategy</span> . Luego de esto mandamos llamar al método <span class="lang:java decode:true crayon-inline ">sayHelloTo</span>  el cual nos regresa el saludo para <strong>Oscar Blancarte</strong>, seguido en la línea 11 llamamos al método <span class="lang:java decode:true crayon-inline ">sayHelloWord</span> , el cual manda un <strong>Hello Word</strong>.</p>
<figure id="attachment_3207" aria-describedby="caption-attachment-3207" style="width: 800px" class="wp-caption aligncenter"><a href="https://codmind.com/courses/java-lambda"><img loading="lazy" class="wp-image-3207 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md.jpg" alt="Curso de Java Lambdas con Streams" width="800" height="450" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md-768x432.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></a><figcaption id="caption-attachment-3207" class="wp-caption-text">Te invitamos a ver nuestro curso de Java Lambdas + Streams para aprender a programar con el nuevos paradigma funcional.</figcaption></figure>
<p>Como vemos la expresión lambda siempre se asigna al método abstracto, por este motivo el método <span class="lang:java decode:true crayon-inline">sayHelloTo</span>  es implementado con el cuerpo de la expresión lamba, mientras que el método <span class="lang:java decode:true crayon-inline ">sayHelloWord</span>  continua con la misma implementación que viene desde la interface.</p>
<p><img loading="lazy" class="aligncenter size-large wp-image-1280" src="http://www.oscarblancarteblog.com/wp-content/uploads/2016/12/Interfaces-funcionales-1024x387.png" alt="Interfaces funcionales" width="648" height="245" /></p>
<p>Observemos la imagen anterior, cuando una expresión lambda es asignada a una interface, está siempre implementará el método abstracto, es por esta razón por la que solo puede existir un método abstracto y muchos defaults.</p>
<p>Finalmente, el resultado de la ejecución es el siguiente:</p>
<pre class="lang:java decode:true">Hello Oscar Blancarte

Hello word</pre>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/12/08/java-8-interfaces-funcionales/">Java 8 – Interfaces funcionales</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2016/12/08/java-8-interfaces-funcionales/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1279</post-id>	</item>
		<item>
		<title>Java 8 – Default Method</title>
		<link>https://www.oscarblancarteblog.com/2016/12/06/java-8-default-method/</link>
					<comments>https://www.oscarblancarteblog.com/2016/12/06/java-8-default-method/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Tue, 06 Dec 2016 09:00:31 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java8]]></category>
		<category><![CDATA[POO]]></category>
		<guid isPermaLink="false">http://www.oscarblancarteblog.com/?p=1274</guid>

					<description><![CDATA[<p>Una de las novedades que trae Java 8 a nivel del lenguaje, son los Default Method o Métodos default, los cuales permiten agregar métodos implementados en las interfaces. Antes de la versión 8 de Java era totalmente imposible definirles cuerpo a los métodos de las interfaces ya que nos marcaba error de compilación. Para agregar [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/12/06/java-8-default-method/">Java 8 – Default Method</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="alignleft wp-image-1275 size-thumbnail" src="http://www.oscarblancarteblog.com/wp-content/uploads/2016/12/Duke_8-copy1-150x150.png" alt="Default Method" width="150" height="150" />Una de las novedades que trae Java 8 a nivel del lenguaje, son los Default Method o Métodos default, los cuales permiten agregar métodos implementados en las interfaces. Antes de la versión 8 de Java era totalmente imposible definirles cuerpo a los métodos de las interfaces ya que nos marcaba error de compilación.</p>
<p>Para agregar un método default solo será necesario marcar un método con el operador <span class="lang:java decode:true crayon-inline">default</span> , veamos un ejemplo de cómo se implementan:</p>
<pre class="lang:java decode:true">public default double getTotal(){
  return getQuantity() * getPrice();
}</pre>
<p>Los métodos default se utilizan cuando es necesario implementar un cuerpo sin la necesidad de tener que implementar por separado una clase abstracta, además los métodos por default se pueden sobrescribir en caso de que la implementación por default no cumpla con lo que requerimos. Tenemos que resaltar que los métodos default no remplazan a las clases abstractas, pues estas últimas son mucho más potentes, debido a que nos permiten definir propiedades a nivel de clase, constructores y métodos privados. Veamos una limitante de los métodos default:</p>
<p><span id="more-1274"></span></p>
<pre class="lang:java decode:true">public default double getTotal(){
  return quantity * price;
}</pre>
<p>Esta interface nos va a marcar error en tiempo de compilación, debido a que no es posible declarar propiedades de clase y mucho menos interactuar con ellas, por lo que estamos limitados a trabajar con los parámetros o con los métodos definidos en la misma interface o que extiende de otra.</p>
<h2>Un ejemplo práctico:</h2>
<p>Imaginemos que estamos programando un sistema que procesa ordenes de varios tipos, cómo el caso de un ERP, este sistema, podría crear varios tipos de órdenes, como una orden de compra, venta, embarque, etc. todas estas órdenes podrían tener algo en común, cómo, por ejemplo, un total, una lista de ítems asociados a la orden y los ítems pueden tener una cantidad de productos y un precio, así mismo los detalles tendrían un total.</p>
<p>El código completo de este articulo lo puedes encontrar en GitHub: https://github.com/oscarjb1/DefaultMethod.git</p>
<p>Lo interesante aquí es que si todas las ordenes tiene un total, ¿no sería bueno tener una definición del método por default que nos calcule el total y a la vez los ítems también implementen su método para obtener el total? De la misma forma, si una orden tiene ítems, no sería bueno definir un método que permite agregar los ítems.</p>
<p>Veamos cómo quedaría si implementáramos los métodos por default, implementaremos dos interfaces, una que representa una order (<span class="lang:java decode:true crayon-inline ">IOrder</span> ) y otra que representa los ítems (<span class="lang:java decode:true crayon-inline ">IOrderItem</span> ):</p>
<pre class="lang:java decode:true " title="IOrder.java">package com.osb.defaultmethod;

import java.util.List;

/**
 * @author Oscar Blancarte
 */
public interface IOrder {
    
    public List&lt;IOrderItem&gt; getOrderItem();
    
    public default double getTotal(){
        double total = 0;
        for (IOrderItem item : getOrderItem()) {
            total += item.getTotal();
        }
        return total;
    }
    
    public default void addOrderItem(IOrderItem orderItem){
        getOrderItem().add(orderItem);
    }
}</pre>
<p>Analicemos los métodos de la clase IOrder:</p>
<ul>
<li><strong>getOrderItem:</strong> método que nos regresará los ítems que tiene la orden, no lo podemos implementar porque no es posible definir propiedades a nivel de clase, salvo constantes. Por lo que la clase que la implemente deberá de regresar una lista de ítems.</li>
<li><strong>getTotal:</strong> este método nos regresará el total de la orden, es decir la sumatoria de todos los ítems de la orden. Cuanta con el operador default lo que nos permite implementarlo recorriendo todos los ítems de la orden y sumando su total.</li>
<li><strong>addOrderItem:</strong> método default que nos permite agregar fácilmente nuevos ítems a la orden.</li>
</ul>
<pre class="lang:java decode:true" title="IOrderItem.java">package com.osb.defaultmethod;

/**
 * @author Oscar Blancarte
 */
public interface IOrderItem {
    
    public double getQuantity();
    public double getPrice();
    
    public default double getTotal(){
        return getQuantity() * getPrice();
    }
}</pre>
<p>Esta segunda interface representa los ítems de la orden, cuanta con los métodos:</p>
<ul>
<li><strong>getQuantity:</strong> deberá retornar la cantidad de productos que tiene la línea.</li>
<li><strong>getPrice<u>:</u></strong> deberá de retornar el precio por producto.</li>
<li><strong>getTotal:</strong> método default que calcula el total de la línea, multiplicando la cantidad por el precio.</li>
</ul>
<p>Hasta este punto ya hemos implementado todos los métodos default y continuaremos creando un par de clases concretas que implementen estas dos interfaces para ver cómo funcionaría en tiempo de ejecución. Para esto crearemos las siguientes clases:</p>
<pre class="lang:java decode:true " title="SalesOrder.java">package com.osb.defaultmethod;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Oscar Blancarte
 */
public class SalesOrder implements IOrder{
    
    private List&lt;IOrderItem&gt; orderItems;

    @Override
    public List&lt;IOrderItem&gt; getOrderItem() {
        if(orderItems==null){
            orderItems = new ArrayList&lt;&gt;();
        }
        return orderItems;
    }
}</pre>
<p>En esta clase representará una orden de venta, por lo cual deberá de implementar la interface <span class="lang:java decode:true crayon-inline">IOrder</span> , pero como podemos ver, solo nos pedirá que implementemos el método <span class="lang:java decode:true crayon-inline ">getOrderItem</span>  el cual es el único que no es default, los métodos <span class="lang:java decode:true crayon-inline ">getTotal</span>  y <span class="lang:java decode:true crayon-inline ">addOrderItem</span>  ya estarán implementados por default y se podrán utilizar sin necesidad de declararlos en la clase.</p>
<p>El método <span class="lang:java decode:true crayon-inline ">getOrderItem</span>  solo regresa la lista de ítems, en caso de que la lista sea nula la crea y la retorna.</p>
<p>La siguiente clase representa los ítems de la orden de venta:</p>
<pre class="lang:java decode:true " title="SalesOrderItem.java">package com.osb.defaultmethod;

/**
 * @author Oscar Blancarte
 */
public class SalesOrderItem implements IOrderItem {
    
    private double quantity;
    private double price;

    public SalesOrderItem(double quantity, double price) {
        this.quantity = quantity;
        this.price = price;
    }
    
    @Override
    public double getQuantity() {
        return quantity;
    }

    @Override
    public double getPrice() {
        return price;
    }
    
}</pre>
<p>Podemos observar que implementan la interface <span class="lang:java decode:true crayon-inline ">IOrderItem</span>  la cual nos pedirá que implementemos los métodos <span class="lang:java decode:true crayon-inline ">getQuantity</span>  y <span class="lang:java decode:true crayon-inline ">getPrice</span>  los cuales ya hemos explicado. El método <span class="lang:java decode:true crayon-inline ">getTotal</span>  ya está implementado por default desde la interface, por lo que ya no será necesario implementarlo en la clase.</p>
<p>Finalmente, la clase <span class="lang:java decode:true crayon-inline ">Main</span> , en donde pondremos a prueba lo que hemos aprendido para ver cómo se comportan los métodos por default en tiempo de ejecución:</p>
<pre class="lang:java decode:true " title="Main.java">package com.osb.defaultmethod;

/**
 * @author Oscar Blancarte
 */
public class Main {
    public static void main(String[] args) {
        SalesOrder salesOrder = new SalesOrder();
        salesOrder.addOrderItem(new SalesOrderItem(10, 100));
        salesOrder.addOrderItem(new SalesOrderItem(1, 20));
        System.out.println("total ==&gt; " +salesOrder.getTotal() );
    }
}</pre>
<p>Lo primero que hacemos es crear una instancia de la Orden de venta (línea 8), luego en las líneas 9 y 10 agregamos dos nuevos ítems. Notemos que el método <span class="lang:java decode:true crayon-inline ">addOrderItem</span>  esta implementado como default en la clase <span class="lang:java decode:true crayon-inline ">IOrde</span> . Cada ítem define un precio y la cantidad.</p>
<figure id="attachment_3207" aria-describedby="caption-attachment-3207" style="width: 800px" class="wp-caption aligncenter"><a href="https://codmind.com/courses/java-lambda"><img loading="lazy" class="wp-image-3207 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md.jpg" alt="Curso de Java Lambdas con Streams" width="800" height="450" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md-768x432.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></a><figcaption id="caption-attachment-3207" class="wp-caption-text">Te invitamos a ver nuestro curso de Java Lambdas + Streams para aprender a programar con el nuevos paradigma funcional.</figcaption></figure>
<p>Finalmente, en la línea 11 imprimimos el total de la orden, el total de la orden es calculado desde el método default de la clase <span class="lang:java decode:true crayon-inline ">IOrder</span>  sumando el total de los ítems y el total de cada ítem también es calculado mediante el método default implementado desde la interface <span class="lang:java decode:true crayon-inline ">IOrderItem</span> .</p>
<p>Como resultado de la ejecución tendremos:</p>
<p><span class="lang:java decode:true crayon-inline ">total ==&gt; 1020.0</span></p>
<h2>Conclusiones:</h2>
<p>Los métodos default son sin duda una gran utilidad, sobre todo porque nos evita tener que tener que implementar clases abstractas, pero como ya lo mencionamos no las sustituyen.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/12/06/java-8-default-method/">Java 8 – Default Method</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2016/12/06/java-8-default-method/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1274</post-id>	</item>
		<item>
		<title>Patrón de diseño Observer</title>
		<link>https://www.oscarblancarteblog.com/2014/07/23/patron-de-diseno-observer/</link>
					<comments>https://www.oscarblancarteblog.com/2014/07/23/patron-de-diseno-observer/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Wed, 23 Jul 2014 15:23:51 +0000</pubDate>
				<category><![CDATA[Patrones de Diseño]]></category>
		<category><![CDATA[arquitectura]]></category>
		<category><![CDATA[diseño]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[Observer]]></category>
		<category><![CDATA[Patron]]></category>
		<category><![CDATA[Patron de diseño]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[Programación orientada a objetos]]></category>
		<guid isPermaLink="false">http://javamex.wordpress.com/?p=209</guid>

					<description><![CDATA[<p>Este es sin duda uno de los patrones mas utilizados cuando trabajamos con aplicaciones de escritorio o al utilizar la Event-Driver Architecture(EDA).Un Observer es un componente el cual lo único que hace es estar atento a los eventos que el Target realiza, Cuando Target realiza un cambio o evento este notifica a todos los Observers [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/07/23/patron-de-diseno-observer/">Patrón de diseño Observer</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>				<a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/11/UML1-e1438565150654.gif"><img loading="lazy" class=" size-full wp-image-726 alignleft" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/11/UML1-e1438565150654.gif" alt="UML" width="86" height="100" /></a>Este es sin duda uno de los patrones mas utilizados cuando trabajamos con aplicaciones de escritorio o al utilizar la Event-Driver Architecture(EDA).Un Observer es un componente el cual lo único que hace es estar atento a los eventos que el Target realiza, Cuando Target realiza un cambio o evento este notifica a todos los Observers que están registrados. De esta manera las clases observer serán notificadas del evento que realizo el Target.</p>
<p>&nbsp;</p>
<p>Para explicar correctamente este Patrón de diseño le comparto esta imagen:</p>
<p><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/observer.png"><img loading="lazy" class="aligncenter wp-image-208" title="Observer" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/observer.png" alt="Observer" width="508" height="282" /></a></p>
<p>Imaginemos un escenario de la vida real para comprender mejor esta patrón para lo cual nos ubicamos en el Aeropuerto y estamos esperando a que nos indiquen que podemos abordar el avión por medio de las bocinas que hay en el aeropuerto.</p>
<p>Bien, de seguro no eres el único que esta esperando el vuelo, de seguro existen muchas personas que esperan el abordaje, En este escenario nosotros junto con todas las demas personas que esperan el vuelo son <strong>Observers </strong>y la bocina es el <strong>Tajet </strong>Ya que todos estamos atento a que nos indique que ya podemos abordar lo cual es un evento que realiza la bocina y que nosotros estamos esperando(Observando) para realizar una acción(Abordar).<span id="more-209"></span></p>
<p>Entonces el mecanismo por el cual el observer trabaja es el siguiente:</p>
<ol>
<li>Existe un componente u Objecto al cual queremos observar(<strong>Tarjet</strong>)</li>
<li>Tenemos algún modulo u otro Objeto(<strong>Observer</strong>) el cual queremos que sea notificado cuando Tarjet realice una acción.</li>
<li>Los <strong>Observers </strong>deben <strong>implementar</strong> una <strong>Interfaz</strong> <strong>común </strong>que tanto el Target como el Observer conozcan.</li>
<li>Los Observers deberán ser registrados en el Tarjet el cual los almacenara en una lista.</li>
<li>Cuando el Tarjet realice una acción notificara a todos los Observers los cuales se registraron en el paso anterior.</li>
<li>Los Observers recibirán la notificación como un Evento el cual el Observer procesara para hacer una acción.</li>
</ol>
<p>&nbsp;</p>
<p>Si nos damos cuenta es mucho mas simple de lo que parece y muchos de las aplicaciones utilizan este patrón y ni siquiera nos damos cuenta.</p>
<p>&nbsp;</p>
<p>En tu experiencia, ¿donde crees que se mas conveniente utilizar esta patrón o como lo implementarías?</p>
<p>&nbsp;</p>
<figure id="attachment_2333" aria-describedby="caption-attachment-2333" style="width: 648px" class="wp-caption aligncenter"><a href="https://reactiveprogramming.io/books/design-patterns/es" target="_blank" rel="noopener"><img loading="lazy" class="wp-image-2333 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/patrones-diseño-banner-1024x392.jpg" alt="Introducción a los patrones de diseño" width="648" height="248" /></a><figcaption id="caption-attachment-2333" class="wp-caption-text">¿Quieres aprender más patrones como este? te invito a que veas mi libro.</figcaption></figure>
<p>&nbsp;</p>
<p>Ya está a la venta mi nuevo libro &#8220;<a href="http://www.oscarblancarteblog.com/libros/introduccion-los-patrones-diseno/">Introducción a los patrones de diseño</a>&#8220;, en donde expongo los 25 patrones de diseño más utilizados y explicados desde un enfoque del mundo real, con ejemplos que pueden ser aplicados en tus proyectos. Sin duda es unos de los libros más completos de patrones de diseño en español.		</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/07/23/patron-de-diseno-observer/">Patrón de diseño Observer</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2014/07/23/patron-de-diseno-observer/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">209</post-id>	</item>
		<item>
		<title>Patrón de diseño Modelo Vista Controlador (MVC)</title>
		<link>https://www.oscarblancarteblog.com/2014/07/21/patron-de-diseno-modelo-vista-controlador-mvc/</link>
					<comments>https://www.oscarblancarteblog.com/2014/07/21/patron-de-diseno-modelo-vista-controlador-mvc/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Mon, 21 Jul 2014 16:07:19 +0000</pubDate>
				<category><![CDATA[Patrones de Diseño]]></category>
		<category><![CDATA[diseño]]></category>
		<category><![CDATA[patrones]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[Programación orientada a objetos]]></category>
		<guid isPermaLink="false">http://javamex.wordpress.com/?p=136</guid>

					<description><![CDATA[<p>Sin duda este es uno de los patrones de diseño mas utilizados cuando desarrollamos una pagina web sin embargo puede que no estemos consciente de que es si. El patrón MVC se ha convertido en un estándar para el desarrollo de aplicaciones que permite separar la aplicación entres capas que aunque estén relacionadas no siempre [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/07/21/patron-de-diseno-modelo-vista-controlador-mvc/">Patrón de diseño Modelo Vista Controlador (MVC)</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>				<a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/11/UML1-e1438565150654.gif"><img loading="lazy" class="alignleft wp-image-726" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/11/UML1-e1438565150654.gif" alt="UML" width="86" height="100" /></a>Sin duda este es uno de los patrones de diseño mas utilizados cuando desarrollamos una pagina web sin embargo puede que no estemos consciente de que es si.</p>
<p>El patrón MVC se ha convertido en un estándar para el desarrollo de aplicaciones que permite separar la aplicación entres capas que aunque estén relacionadas no siempre tiene por que estar juntas. Estas capas son la Vista, el Controlador y el Modelo y a continuación explico que es cada uno.</p>
<p><strong>Modelo: </strong>El modelo representa la información como tal, representan los datos con los que la aplicación esta trabajando, ya sea los datos de una tabla, un formulario, etc. Podríamos decir que el modelo es la información la cual el usuario puede visualizar en pantalla.</p>
<p>Por ejemplo este texto que estas leyendo en este momento es el modelo.</p>
<p><strong>Vista: </strong>Esta es la representación gráfica o pantalla que estas viendo en este momento, La vista requiere del Modelo para mostrar la información en la pantalla.</p>
<p><strong>Controlador: </strong>El controlador es el puente entre la vista y el modelo, ya que desde el controlador podemos hacer operaciones que cambien el modelo lo cual representa un cambio en los datos de la vista.</p>
<p>&nbsp;</p>
<p>El patrón MVC lo podrías ver de la siguiente manera:</p>
<p><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/mvc.png"><img loading="lazy" class="aligncenter size-full wp-image-137" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/mvc.png" alt="MVC" width="509" height="271" /></a><span id="more-136"></span></p>
<p>Fig.1: Patrón MVC &#8211; Las lineas continuas son asociaciones directas y las punteadas don indirectas.</p>
<p>Como podemos ver en la fig1 el controlador tiene una asociación con la vista y el modelo, ademas la vista tiene una asociación con el modelo.</p>
<p>Por lo cual cuando el usuario realiza una operación lo hace a través del controlador el cual realiza operaciones sobre el modelo y luego notifica a la vista para que actualice la información que vemos en pantalla, Cuando el modelo es actualizado este puede arrojar eventos que notifican a la vista para que se actualice es por eso que existe la linea punteada entre ambos.</p>
<p>La vista tiene una relación indirecta con el controlador debido a que existen implementaciones de MVC en las cuales la vista no tiene acceso al Modelo por lo cual toda la información la obtiene a través del controlador.</p>
<p>La siguiente figura muestra como los componentes interactúan</p>
<p><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/mvcflow.png"><img loading="lazy" class="aligncenter size-full wp-image-139" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/mvcflow.png" alt="MVCFlow" width="528" height="391" /></a></p>
<p>Pasos</p>
<ol>
<li>El usuario realiza un operación en la pantalla como presionar un botón.</li>
<li>El controlador recibe la petición de realizar una acción</li>
<li>El modelo es actualiza por medio del controlador el cual puede agregar,actualizar o borrar información.</li>
<li>La vista es actualizada con los cambios realizados al modelo.</li>
<li>El usuario recibe las actualizaciones en pantalla.</li>
<li>FIN.</li>
</ol>
<p>Espero que esta breve explicación de lo que es MVC les sea de utilidad.</p>
<p>&nbsp;</p>
<figure id="attachment_2333" aria-describedby="caption-attachment-2333" style="width: 648px" class="wp-caption aligncenter"><a href="https://reactiveprogramming.io/books/design-patterns/es" target="_blank" rel="noopener"><img loading="lazy" class="wp-image-2333 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/patrones-diseño-banner-1024x392.jpg" alt="Introducción a los patrones de diseño" width="648" height="248" /></a><figcaption id="caption-attachment-2333" class="wp-caption-text">¿Quieres aprender más patrones como este? te invito a que veas mi libro.</figcaption></figure>
<p>&nbsp;</p>
<p>Ya está a la venta mi nuevo libro &#8220;<a href="http://www.oscarblancarteblog.com/libros/introduccion-los-patrones-diseno/">Introducción a los patrones de diseño</a>&#8220;, en donde expongo los 25 patrones de diseño más utilizados y explicados desde un enfoque del mundo real, con ejemplos que pueden ser aplicados en tus proyectos. Sin duda es unos de los libros más completos de patrones de diseño en español.		</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/07/21/patron-de-diseno-modelo-vista-controlador-mvc/">Patrón de diseño Modelo Vista Controlador (MVC)</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2014/07/21/patron-de-diseno-modelo-vista-controlador-mvc/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">136</post-id>	</item>
		<item>
		<title>Patrón de Diseño Factory</title>
		<link>https://www.oscarblancarteblog.com/2014/07/18/patron-de-diseno-factory/</link>
					<comments>https://www.oscarblancarteblog.com/2014/07/18/patron-de-diseno-factory/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Fri, 18 Jul 2014 18:20:35 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Patrones de Diseño]]></category>
		<category><![CDATA[Patrones de diseño]]></category>
		<category><![CDATA[POO]]></category>
		<guid isPermaLink="false">http://javamex.wordpress.com/?p=108</guid>

					<description><![CDATA[<p>El patrón de diseño Factory Method nos permite la creación de un subtipo determinado por medio de una clase de Factoría, la cual oculta los detalles de creación del objeto. El objeto real creados es enmascarado detrás de una interface común entre todos los objetos que pueden ser creado, con la finalidad de que estos [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/07/18/patron-de-diseno-factory/">Patrón de Diseño Factory</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
				
<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/factory-method-1-1024x574.jpg" alt="Patrón de diseño Factory Method" class="wp-image-2536"/></figure>



<p>El patrón de diseño Factory Method nos permite la creación de un subtipo determinado por medio de una clase de Factoría, la cual oculta los detalles de creación del objeto.</p>



<span id="more-108"></span>



<p>El objeto real creados es enmascarado detrás de una interface común entre todos los objetos que pueden ser creado, con la finalidad de que estos pueden variar sin afectar la forma en que el cliente interactúa con ellos. </p>



<p>Es normal que un Factory pueda crear varios subtipos de una determinada interface y que todos los objetos concretos fabricados hagan una tarea similar pero con detalles de implementación diferentes. </p>



<p>La intención del Factory Method es tener una clase a la cual delegar la responsabilidad de la creación de los objetos, para que no sea el mismo programador el que decida que clase instanciará, si no que delegará esta responsabilidad al Factory confiando en que este le regresará la clase adecuada para trabajar. </p>



<p>Lo anterior puede resultado un poco absurdo, pues para que necesitaría el programador ayuda de una clase para crear un objeto, en su lugar puede hacer simplemente un new y listo, tiene la instancia creada, sin embargo, el patrón Factory method se utiliza para casos en los que no se sabe en tiempo de diseño que subtipo vamos a necesitar, y en su lugar, definimos eso en la base de datos, en un archivo de configuración, o simplemente por medio de alguna condición en tiempo de ejecución podemos determinar que clase se utilizará.<br><br><br></p>



<h2>Estructura del patrón Factory Method</h2>



<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/factory-method-diagram1.png" alt="" class="wp-image-2537"/></figure>



<p>El siguiente diagrama muestra los componentes que conforman el patrón de diseño:<br></p>



<ul><li><strong>IProduct: </strong>Representa de forma abstracta el objeto que queremos crear, mediante esta interface se definen la estructura que tendrá el objeto creado.</li><li><strong>ConcreteProduct: </strong>Representa una implementación concreta de la interface <em>IProduct</em>, la cual es creada a través del <em>ConcreteFactory</em>.</li><li><strong>AbstractFactory: </strong>Este componente puede ser opcional, sin embargo, se recomienda la creación de un <em>AbstractFactory </em>que define el comportamiento por default de los <em>ConcreteFactory</em>.</li><li><strong>Concrete Factory: </strong>Representa una fábrica concreta la cual es utilizada para la creación de los <em>ConcreteProduct</em>, esta clase hereda el comportamiento básico del <em>AbstractFactory</em>.</li></ul>



<p><br><br></p>



<h2>Secuencia de ejecución</h2>



<p>La siguiente sección describe la secuencia de ejecución del patrón</p>



<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/factory-method-sequence1-1024x600.png" alt="" class="wp-image-2538"/></figure>



<p>El diagrama se interpreta de la siguiente manera:</p>



<ol><li>El cliente le solicita al <em>ConcreteFactory </em>la creación del <em>ProductA </em>.</li><li>El <em>ConcreteFactory </em>localiza la implementación concreta de <em>ProductA </em>y crea una nueva instancia.</li><li>El <em>ConcreteFactory </em>regresa el <em>ConcreteProductA </em>creado.</li><li>El cliente le solicita al <em>ConcreteFactory </em>la creación del <em>ProductB</em>.</li><li>El <em>ConcreteFactory </em>localiza la implementación concreta del <em>ProductB </em>y crea una nueva instancia.</li><li>El <em>ConcreteFactory </em>regresa el <em>ConcreteProductB </em>creado.</li></ol>



<p><br><br></p>



<h2>Ejemplo práctico</h2>



<p>Para comprender mejor como funciona el patrón Factory Method analizaremos un ejemplo prácticos con el cual podemos presentarnos alguno de nuestros proyectos, el cual corresponde a una aplicación que se puede conectar a más de una base de datos, sin embargo, la base de datos a utilizar no se sabrá de antemano, si no que por medio de la configuración es como podremos determinar que base de datos estaremos utilizando.</p>



<p>Como vemos, en este caso, no está clara la base de datos que vamos a utilizar, por lo tanto no podemos crear una aplicación que se conecta a una base de datos determinada, si no que tenemos que esperar hasta conocer la configuración para poder establecer la conexión. Una posible solución es crear una serie de <em>IF&#8230;ELSE IF</em> para crear la conexión al momento de leer la configuración, sin embargo, esto no es para nada recomendable, pues crearemos una aplicación difícil de mantener y que además revuelva la lógica para determinar la base de datos junto con la lógica propia del sistema.</p>



<p>En su lugar, lo recomendable es crear un Factory Method que nos cree un objeto que nos permita conectarnos a la base de datos, y que este objeto oculte los detalles de implementación, por otro lado, el Factory Method ocultara los detalles de implementación para leer la configuración y crear el objeto adecuado según la configuración, de esta forma, todos los detalles son ocultados al cliente y este solo se preocupa por implementar la lógica.<br><br></p>



<blockquote class="wp-block-quote"><p>Antes de comenzar, puedes ver todo el código fuente en GitHub: <a href="https://github.com/oscarjb1/blog-patterns-factorymethod">https://github.com/oscarjb1/blog-patterns-factorymethod</a></p></blockquote>



<p><br>Lo primero será definir la interface que implementarán las clases que se conectarán a la base de datos:</p>



<pre class="wp-block-code"><code>package com.oscarblancarteblog;

import java.sql.Connection;

public interface IDBAdapter {
    public Connection getConnection();
}</code></pre>



<p><br>Esta interface solo define el método <code>getConnection</code>, la cual deberá regresar una conexión abierta a la base de datos.</p>



<p>El siguiente paso es crear las clases concretas que se conectarán a las bases de datos Oracle, MySQL y SQLServer:</p>



<pre class="wp-block-code"><code>package com.oscarblancarteblog;

import java.sql.Connection;
import java.sql.DriverManager;

public class OracleDBAdapter implements IDBAdapter {
    
    static{
        try {
            //new oracle.jdbc.OracleDriver();
        } catch (Exception e) {
            throw new RuntimeException("Unexpected error on load Oracle Driver");
        }
    }

    @Override
    public Connection getConnection() {
        try {
            String user = ConfigLoader.getPropery("Oracle.user");
            String password = ConfigLoader.getPropery("Oracle.password");
            String host = ConfigLoader.getPropery("Oracle.host");
            String port = ConfigLoader.getPropery("Oracle.port");
            String db = ConfigLoader.getPropery("Oracle.db");

            String url = "jdbc:oracle:thin:@${host}:${port}:${db}"
                    .replace("${host}", host).replace("${port}", port).replace("${db}", db);

            Connection connection = DriverManager.getConnection(url, user, password); //connection to MySQL
            return connection;
        } catch (Exception e) {
            throw new RuntimeException("Oracle connection error " + e.getMessage());
        }
    }
    
}</code></pre>



<pre class="wp-block-code"><code>package com.oscarblancarteblog;

import java.sql.Connection;
import java.sql.DriverManager;

public class MySQLDBAdapter implements IDBAdapter {

    static {
        try {
            new com.mysql.jdbc.Driver();
        } catch (Exception e) {
            throw new RuntimeException("Unexpected error on load MySQL Driver");
        }
    }

    @Override
    public Connection getConnection() {
        try {
            String user = ConfigLoader.getPropery("MySQL.user");
            String password = ConfigLoader.getPropery("MySQL.password");
            String host = ConfigLoader.getPropery("MySQL.host");
            String port = ConfigLoader.getPropery("MySQL.port");
            String db = ConfigLoader.getPropery("MySQL.db");

            String url = "jdbc:mysql://${host}:${port}/${db}?zeroDateTimeBehavior=convertToNull&amp;serverTimezone=UTC&amp;useSSL=false;"
                    .replace("${host}", host).replace("${port}", port).replace("${db}", db);

            Connection connection = DriverManager.getConnection(url, user, password); //connection to MySQL
            return connection;
        } catch (Exception e) {
            throw new RuntimeException("MySQL connection error " + e.getMessage());
        }
    }

}
</code></pre>



<pre class="wp-block-code"><code>package com.oscarblancarteblog;

import java.sql.Connection;
import java.sql.DriverManager;

public class SQLServerAdapter implements IDBAdapter {
    
    static{
        try {
            //new com.microsoft.jdbc.sqlserver.SQLServerDriver();
        } catch (Exception e) {
            throw new RuntimeException("Unexpected error on load SQLServer Driver");
        }
    }

    @Override
    public Connection getConnection() {
        try {
            String user = ConfigLoader.getPropery("SQLServer.user");
            String password = ConfigLoader.getPropery("SQLServer.password");
            String host = ConfigLoader.getPropery("SQLServer.host");
            String port = ConfigLoader.getPropery("SQLServer.port");
            String db = ConfigLoader.getPropery("SQLServer.db");

            String url = "jdbc:sqlserver://${host}:${port};databaseName=${db};"
                    .replace("${host}", host).replace("${port}", port).replace("${db}", db);

            Connection connection = DriverManager.getConnection(url, user, password); //connection to MySQL
            return connection;
        } catch (Exception e) {
            throw new RuntimeException("SQLServer connection error " + e.getMessage());
        }
    }
    
}</code></pre>



<p><br>Como acabamos de ver, estas clases tiene como única responsabilidad de crear la conexiones a las base de datos y registrar el driver JDBC correspondiente. Adicional, utilizan un archivo de configuración para recuperar los datos de conexión, el cual analizáramos más adelante.</p>



<p>Para recuperar la configuración se utiliza una clase de utilidad llamada <code>ConfigLoader</code>, la cual lee y carga en memoria el archivo <code>dbconfig.properties</code>:</p>



<pre class="wp-block-code"><code>package com.oscarblancarteblog;

import java.io.InputStream;
import java.util.Map;
import java.util.Properties;

public class ConfigLoader {

    private static Properties props;

    static {
        try {
            InputStream stream = ClassLoader.getSystemResourceAsStream("META-INF/dbconfig.properties");
            ConfigLoader.props = new Properties();
            props.load(stream);
        } catch (Exception e) {
            throw new RuntimeException("Faild to load configuration");
        }
    }
    
    public static String getDBType(){
        return props.getProperty("dbtype");
    }
    
    public static String getPropery(String propName){
        return props.getProperty(propName);
    }
    
    
}
</code></pre>



<p><br>El archivos de propiedades se ve de la siguiente manera:</p>



<pre class="wp-block-code"><code>dbtype MySQL
#Values -> MySQL | Oracle | SQLServer


MySQL.user root
MySQL.password 1234
MySQL.host localhost
MySQL.port 3306
MySQL.db factory

Oracle.user sys
Oracle.password 1234
Oracle.host localhost
Oracle.port 1521
Oracle.db factory

SQLServer.user sa
SQLServer.password 1234
SQLServer.host localhost
SQLServer.port 1433
SQLServer.db factory</code></pre>



<p><br>Finalmente, tenemos la clase <code>DBFactory</code>, la cual se encarga de crear la instancia correcta de la interface <code>IDBAdapter</code> basado en el valor de la propiedad <code>dbtype</code> del archivo <code>dbconfig.properties</code>:</p>



<pre class="wp-block-code"><code>package com.oscarblancarteblog;

public class DBFactory {
    public static IDBAdapter getDBAdapter(){
        String dbType = ConfigLoader.getDBType();
        System.out.println("DBType => " + dbType);
        switch(dbType){
            case "MySQL":
                return new MySQLDBAdapter();
            case "Oracle":
                return new OracleDBAdapter();
            case "SQLServer":
                return new SQLServerAdapter();
            default:
                throw new RuntimeException("Unsupported db type");
        }
    }
}</code></pre>



<p><br>Como podemos apreciar, esta clase tiene una lógica para determina la clase que deberá de regresar, por su parte, el cliente no tiene por que saber cual es la implementación concreta que creará el Factory, lo que permitiría que en el futuro cambiáramos de implementación sin afectar al cliente.<br><br><br></p>



<h2>Probando la solución</h2>



<p>Finalmente, ejecutaremos una prueba para comprobar que todo funciona según lo explicado, para eso, creamos la clase <code>Main</code>, la cual se ve de la siguiente manera:</p>



<pre class="wp-block-code"><code>package com.oscarblancarteblog;

import java.sql.Connection;

public class Main {

    public static void main(String[] args) {
        try {
            IDBAdapter adapter = DBFactory.getDBAdapter();
            Connection connection = adapter.getConnection();
            System.out.println("Is Open => " + (!connection.isClosed()));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}</code></pre>



<p><br>Al ejecutar este prueba tenemos como resultado la siguiente salida:</p>



<pre class="wp-block-code"><code>DBType => MySQL
Is Open => true</code></pre>



<p><br>Como vemos, <code>DBType</code> indica que estamos utilizando la conexión a MySQL y al propiedad <code>Is Open</code> nos indica que la conexión se realizo correctamente. Si cambiamos la propiedad <code>dbtype</code> del archivo <code>dbconfig.properties</code> veremos como nos podemos conectar a las demás base de datos.<br><br></p>



				
<figure class="wp-block-image"><a href="https://reactiveprogramming.io/books/design-patterns/es" target="_blank" rel="noreferrer noopener"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/patrones-diseño-banner-1024x392.jpg" alt="" class="wp-image-2333"/></a><figcaption>¿Te gustaría aprender más patrones como este? te invito a que veas mi nuevo libro &#8220;Introducción a los patrones de diseño&#8221;, donde explico los principales patrones de diseño desde un enfoque práctico y con ejemplos del mundo real. Olvídate de aprender con los ejemplos típicos de Internet, como crear una pizza, clase de animales que ladren o maullen, o figuras geométricas.</figcaption></figure>
		


<p><br><br></p>



<h2>Conclusiones</h2>



<p>Como hemos pido observar, implementar el patrón de diseño Factory Method es muy simple y otorga grandes ventajas que son fáciles de apreciar, como separar la lógica de creación de objetos en una clase de factoria o la facilidad de variar dinamicamnte la implementación del objeto fabricado sin afectar al cliente.<br><br><br></p>
		<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/07/18/patron-de-diseno-factory/">Patrón de Diseño Factory</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2014/07/18/patron-de-diseno-factory/feed/</wfw:commentRss>
			<slash:comments>15</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">108</post-id>	</item>
		<item>
		<title>Java &#8211; Como eliminar rápidamente elementos repetidos de una colección</title>
		<link>https://www.oscarblancarteblog.com/2014/07/17/java-como-eliminar-rapidamente-elementos-repetidos-de-una-coleccon/</link>
					<comments>https://www.oscarblancarteblog.com/2014/07/17/java-como-eliminar-rapidamente-elementos-repetidos-de-una-coleccon/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 17 Jul 2014 21:30:00 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[hashmap]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[Programación orientada a objetos]]></category>
		<category><![CDATA[software]]></category>
		<guid isPermaLink="false">http://javamex.wordpress.com/2014/07/17/java-como-eliminar-rapidamente-elementos-repetidos-de-una-coleccon/</guid>

					<description><![CDATA[<p>Hace tiempo un amigo me preguntaba  como podía eliminar los elementos repetidos de una colección sin hacer mucho esfuerzo. Bien la solución que considero mucho mas rápida es con ayuda de una HashMap ya que al no permitir elementos repetidos como llave nos ayuda a descartar de forma muy rápida los elementos que ya tenemos [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/07/17/java-como-eliminar-rapidamente-elementos-repetidos-de-una-coleccon/">Java &#8211; Como eliminar rápidamente elementos repetidos de una colección</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;">Hace tiempo un amigo me preguntaba  como podía eliminar los elementos repetidos de una colección sin hacer mucho esfuerzo.</p>
<p style="text-align: justify;">Bien la solución que considero mucho mas rápida es con ayuda de una HashMap ya que al no permitir elementos repetidos como llave nos ayuda a descartar de forma muy rápida los elementos que ya tenemos en nuestra colección.<span id="more-89"></span></p>
<p><figure id="attachment_3213" aria-describedby="caption-attachment-3213" style="width: 800px" class="wp-caption aligncenter"><a href="https://codmind.com/courses/java"><img loading="lazy" class="wp-image-3213 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/java-core-banner-3-md.jpg" alt="Curso de Java Core" width="800" height="450" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/java-core-banner-3-md.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/java-core-banner-3-md-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/java-core-banner-3-md-768x432.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></a><figcaption id="caption-attachment-3213" class="wp-caption-text">Te invito a que veas mi curso de Java Core, en el cual enseñamos Java desde cero con las mejores prácticas y un proyecto final.</figcaption></figure></p>
<p style="text-align: justify;">Imagines un escenario donde tenemos una lista de clase Cliente la cual tiene un campo de ID que nos ayude a identificarlo como único, Con esto lo único que tendríamos que hacer es meter como llave el ID y como Valor el Objecto Cliente completo. Al terminar de introducir todos los elementos los elementos repetidos serán automáticamente descartados y solo faltaría iterar las Entradas del HashMap para recuperar los valores únicos.</p>
<p style="text-align: justify;">Veamos el siguiente Código:</p>
<p style="text-align: justify;"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/codigo.png"><img loading="lazy" class="aligncenter size-full wp-image-88" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/codigo.png" alt="codigo" width="513" height="319" /></a></p>
<p style="text-align: justify;">Para los que no les quedo muy claro como el Map elimina los repetidos les explico:</p>
<p style="text-align: justify;">Los Map tiene la característica de tener por cada entrada dos elementos el Key y el Value, El Key representa un elemento único y no puedo contener repetidos por lo que si se intenta meter un elemento repetido lo que hará es sustituir este ultimo por que estaba antes y el Value representa un valor cualquiera asociado a la llave o Key.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/07/17/java-como-eliminar-rapidamente-elementos-repetidos-de-una-coleccon/">Java &#8211; Como eliminar rápidamente elementos repetidos de una colección</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2014/07/17/java-como-eliminar-rapidamente-elementos-repetidos-de-una-coleccon/feed/</wfw:commentRss>
			<slash:comments>11</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">89</post-id>	</item>
		<item>
		<title>Java &#8211; Weakreference</title>
		<link>https://www.oscarblancarteblog.com/2014/07/16/java-weakreference/</link>
					<comments>https://www.oscarblancarteblog.com/2014/07/16/java-weakreference/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Wed, 16 Jul 2014 23:04:13 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[Programación orientada a objetos]]></category>
		<category><![CDATA[weakreference]]></category>
		<guid isPermaLink="false">http://javamex.wordpress.com/2014/07/16/java-weakreference/</guid>

					<description><![CDATA[<p>Este tema hasta para los expertos en java les puede resultar desconocido y es que siempre creemos que un objeto que no esta referenciado por ninguna variable es candidato para que  el Garbage Colector lo elimine para liberar la memoria, sin embargo esto no es todo cierto ya que existen las referencias blandas las cuales [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/07/16/java-weakreference/">Java &#8211; Weakreference</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>				Este tema hasta para los expertos en java les puede resultar desconocido y es que siempre creemos que un objeto que no esta referenciado por ninguna variable es candidato para que  el Garbage Colector lo elimine para liberar la memoria, sin embargo esto no es todo cierto ya que existen las referencias blandas las cuales <span id="more-68"></span>a pesar de hacer referencia a un objeto en memoria estos objetos pueden se eliminados por el Garbage Colector.</p>
<p>&nbsp;</p>
<p>Java ofrece la clase WeakReference la cual se define de la siguiente manera</p>
<p><strong>WeakReference&lt;T&gt; reference = new WeakReferente&lt;T&gt;(new T());</strong></p>
<p>En este ejemplo T es de tipo Genérico y deberemos sustituirlo por la clase que queramos administrar, por ejemplo si tenemos una clase Persona tendríamos que crear el WeakReference de la siguiente manera</p>
<p><strong>WeakReference&lt;Persona&gt; reference = new WeakReference&lt;Persona&gt;(new Persona());</strong></p>
<p>En este momento tendremos una referencia blanda hacia el objeto que creado y para obtener al objeto Persona tendremos que hacerlo mediante el metodo get de WeakReference de la siguiente manera:</p>
<p><strong>Persona persona = reference.get();</strong></p>
<p>Pero hay que tener cuidad siempre que obtengamos la referencia pues esta podría ser Null en cualquier momento ya que si ninguna otra variable tiene una referencia fuerte o Strong Reference a este objeto el Garbage Colector la eliminara.</p>
<p>&nbsp;</p>
<p>Al igual que existen las referencias blandas o WeakReference también existe un HashMap de WeakReference la cual es  WeakHashMap&lt;T,D&gt; la cual tiene la misma mecánica pero implementado como un Map.</p>
<p>&nbsp;</p>
<p>Estas son algunas de las cosas extrañas que existen en Java pero que nos interesante saberlas.</p>
<p>&nbsp;		</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/07/16/java-weakreference/">Java &#8211; Weakreference</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2014/07/16/java-weakreference/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">68</post-id>	</item>
		<item>
		<title>JPA, Hibernate VS JDBC</title>
		<link>https://www.oscarblancarteblog.com/2014/07/15/jpa-hibernate-vs-jdbc/</link>
					<comments>https://www.oscarblancarteblog.com/2014/07/15/jpa-hibernate-vs-jdbc/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Tue, 15 Jul 2014 22:00:39 +0000</pubDate>
				<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[JDBC]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[ejb]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jdbc]]></category>
		<category><![CDATA[jpa]]></category>
		<category><![CDATA[objeto relacional]]></category>
		<category><![CDATA[orm]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[Programación orientada a objetos]]></category>
		<guid isPermaLink="false">http://javamex.wordpress.com/2014/07/15/jpa-hibernate-vs-jdbc/</guid>

					<description><![CDATA[<p>Los que ya han tenido la oportunidad de trabajar con algún ORM como JPA o Hibernate sabrán las bondades que tiene ya que nos permite desarrollar de una forma mucho mas rápida y con muchos menos errores en tiempo de ejecución ya que nos permite modelar nuestras entidad como Clases Java las cuales serán convertidas [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/07/15/jpa-hibernate-vs-jdbc/">JPA, Hibernate VS JDBC</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>				<a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/JPAHibernate1-e1477360564109.jpg"><img loading="lazy" class="size-full wp-image-603 alignleft" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/JPAHibernate1-e1477360564109.jpg" alt="JPA HIBERNATE JDBC" width="150" height="83" /></a>Los que ya han tenido la oportunidad de trabajar con algún ORM como JPA o Hibernate sabrán las bondades que tiene ya que nos permite desarrollar de una forma mucho mas rápida y con muchos menos errores en tiempo de ejecución ya que nos permite modelar nuestras entidad como Clases Java las cuales serán convertidas a las instrucciones Insert, Update o Select según sea la operación a realizar. Claro que todas estos beneficios tiene un costo y es que el performance se degrada debido a todas las conversiones que se tiene que hacer para convertir las Entity en Querys y los ResultSet pasarlos a clases ademas que cada registro representa un Objeto en memoria que tendrá <span id="more-24"></span>que ser administrador por nuestra servidor.</p>
<p>Por otro lado tenemos a JDBC que nos brinda total libertad de hacer lo que queramos sin ningún tipo de limitación explotando al máximo las características de la base datos. JDBC nos permite realizar consultas nativas para cada base de datos lo que ayuda mucho a la velocidad de respuesta y los resultados son devueltos en un ResultSet los cuales podemos extraer solamente los datos que requerimos y no toda la Entity como en el caso de JPA o Hibernate.</p>
<p>&nbsp;</p>
<h2><strong>JPA,Hibernate</strong></h2>
<p>Ventajas</p>
<ol>
<li>Nos permite desarrollar mucho mas rápido.</li>
<li>Permite trabajar con la base de datos por medio de entidades en vez de Querys.</li>
<li>Nos ofrece un paradigma 100% orientado a objetos.</li>
<li>Elimina errores en tiempo de ejecución.</li>
<li>Mejora el mantenimiento del software.</li>
</ol>
<p>Desventajas</p>
<ol>
<li>No ofrece toda la funcionalidad que ofrecería tirar consultas nativas.</li>
<li>El performance es mucho mas bajo que realizar las consultas por JBDC.</li>
<li>Puede representar una curva de aprendizaje mas grande.</li>
</ol>
<p>&nbsp;</p>
<h2><strong>JDBC</strong></h2>
<p>Ventajas</p>
<ul>
<li>Ofrece un performance superior ya que es la forma mas directa de mandar instrucciones la base de datos.</li>
<li>Permite explotar al máximo las funcionalidades de la base de datos.</li>
</ul>
<p>Desventajas</p>
<ul>
<li>El mantenimiento es mucho mas costoso.</li>
<li>Introduce muchos errores en tiempo de ejecución.</li>
<li>El desarrollo es mucho mas lento.</li>
</ul>
<p>&nbsp;</p>
<p>Probablemente pensaras que JPA o Hibernate son mejores ya que ofrece mayor ventajas que desventajas sin embargo las desventajas que tiene son muy serias y pueden ser cruciales a la hora de decidir que tecnología utilizar ya que si tenemos una aplicación muy buena y fácil de mantener pero que tarda demasiado para consultar datos puede llegar a ser algo muy malo.</p>
<p>Como conclusión yo diría que si requieres una aplicación donde el rendimiento sea el factor mas importante utilices JDBC, pero por otra parte si el rendimiento es algo que no están importante puedes utilizar JPA o Hibernate.</p>
<h2></h2>
<h2>Tutorial de JPA Gratis!!</h2>
<p>Si estás leyendo esto en este momento es por seguramente estas interesado en aprender Hibernate o JPA, pues te tengo buenas noticias, ya que he iniciado un tutorial muy completo de JPA para que aprendas desde cero y sin conocimientos previos como utilizar JPA. No te sientas mal si lo que tu buscas es aprender Hibernate, ya que actualmente existe una implementación de JPA desarrollada por Hibernate. Además, JPA es el ORM Estándar de Java y que se integra a la perfección con el resto de especificaciones de Java, como lo es EJB 3.X, CDI, Bean Validator, entre otras más. Pues bien, si estas interesado en tomar este tutorial puedes <a href="http://www.oscarblancarteblog.com/tutoriales/java-persistence-api-jpa/">entrar aquí</a>.</p>
<p>&nbsp;		</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/07/15/jpa-hibernate-vs-jdbc/">JPA, Hibernate VS JDBC</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2014/07/15/jpa-hibernate-vs-jdbc/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">24</post-id>	</item>
		<item>
		<title>Que es el Polimorfismo?</title>
		<link>https://www.oscarblancarteblog.com/2014/07/15/que-es-el-polimorfismo/</link>
					<comments>https://www.oscarblancarteblog.com/2014/07/15/que-es-el-polimorfismo/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Tue, 15 Jul 2014 17:27:12 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[Programación orientada a objetos]]></category>
		<category><![CDATA[software]]></category>
		<guid isPermaLink="false">http://javamex.wordpress.com/2014/07/15/que-es-el-polimorfismo/</guid>

					<description><![CDATA[<p>Si son nuevos en la programación seguramente esta palabra les causar dolor de cabeza ya que desde mi punto de vista esta es la caracterizara del paradigma orientado a objetos mas difícil de comprender pero no se preocupen tratare de explicarles lo mas simplemente posible. El polimorfismo permite que nuestro programa realice tareas que se [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/07/15/que-es-el-polimorfismo/">Que es el Polimorfismo?</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>				Si son nuevos en la programación seguramente esta palabra les causar dolor de cabeza ya que desde mi punto de vista esta es la caracterizara del paradigma orientado a objetos mas difícil de comprender pero no se preocupen tratare de explicarles lo mas simplemente posible.</p>
<p>El polimorfismo permite que nuestro programa realice tareas que se definirán hasta el tiempo de ejecución.<span id="more-15"></span></p>
<p>Si escribimos un código que sume dos números nuestra programación sera muy simple ya que podemos determinar el comportamiento del programa con solo ver el código, por ejemplo</p>
<p>public class Main{</p>
<p>public static void main(String[] args){</p>
<p>Operacion op= new Operacion();</p>
<p>double suma = op.operacion(5,10);</p>
<p>System.out.println(&#8220;Suma ==&gt; &#8221; + suma);</p>
<p>}</p>
<p>}</p>
<p>public class Operacion{</p>
<p>public double operacion(double a, double b){</p>
<p>return a +b;</p>
<p>}</p>
<p>}</p>
<p>Con solo ver el siguiente código podemos determinar que el programa sumara dos numero y finalizara ya que código a ejecutar esta definido de esta forma y nada puede hacer que cambie en tiempo de ejecución. Sin embargo con el polimorfismos esto cambia ya la funcionalidad que se ejecuta dependerá de la implantación que se le de aun método determinado.</p>
<p>Una vez comprendido el código anterior veremos como trabajaría con polimorfismo.</p>
<p>Imaginemos que ya tenemos definidas las clases anteriores pero hora definimos una nueva clase llamada Resta la cual extiende de &#8220;Operacion&#8221; pero en vez de sumar los números los resta:</p>
<p>public class Resta extends Operacion{</p>
<p>public double operacion(double a, double b){</p>
<p>return a &#8211; b;</p>
<p>}</p>
<p>}</p>
<p>Podemos apreciar que el método &#8220;operacion&#8221; esta definido igual que en la clase &#8220;Operacion&#8221; lo que provoca algo llamada Override o sobre escribir el método.</p>
<p>Con esto en mente modificaremos el método main de la clase anterior y veremos lo que sucede:</p>
<p>public class Main{</p>
<p>public static void main(String[] args){</p>
<p>Operacion opSum= new Operacion();</p>
<p>double suma = opSum.operacion(5,10);</p>
<p>System.out.println(&#8220;Suma ==&gt; &#8221; + suma);</p>
<p>Operacion opRest = <strong>new Resta(5,10);</strong></p>
<p>double resta = opRest.operacion();</p>
<p>System.out.println(&#8220;Resta ==&gt; &#8221; + resta);</p>
<p>}</p>
<p>}</p>
<p>Como resultado tendremos la suma de 5 + 10 = 15 seguido de la resta de 5-10 = -5.</p>
<p>La clave aquí es que opRest a pesar de tipo &#8220;Operacion&#8221; tiene asignada una referencia a una instancia de la clase Resta la cual al extender de &#8220;Operacion&#8221; nos permite asignarla a una variable de tipo &#8220;Operacion&#8221; esto hace que en tiempo de ejecución el metodo &#8220;operacion&#8221; de la variable opRest ejecute el código de la clase Resta en vez de la clase &#8220;Operacion&#8221;</p>
<p>Bien a esto se le llama Polimorfismo&#8230;</p>
<p>&nbsp;		</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/07/15/que-es-el-polimorfismo/">Que es el Polimorfismo?</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2014/07/15/que-es-el-polimorfismo/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">15</post-id>	</item>
	</channel>
</rss>
