<?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>Patrones de diseño &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<atom:link href="https://www.oscarblancarteblog.com/tag/patrones-de-diseno/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.oscarblancarteblog.com</link>
	<description>Software Architect &#38; FullStack developer</description>
	<lastBuildDate>Mon, 24 Sep 2018 17:00:35 +0000</lastBuildDate>
	<language>es-MX</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.11</generator>

<image>
	<url>https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/cropped-ob-32x32.png</url>
	<title>Patrones de diseño &#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>Service Discovery pattern para microservicios</title>
		<link>https://www.oscarblancarteblog.com/2018/09/24/service-discovery-pattern-para-microservicios/</link>
					<comments>https://www.oscarblancarteblog.com/2018/09/24/service-discovery-pattern-para-microservicios/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Mon, 24 Sep 2018 17:00:35 +0000</pubDate>
				<category><![CDATA[EAI]]></category>
		<category><![CDATA[Patrones de Diseño]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Patrones de diseño]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2322</guid>

					<description><![CDATA[<p>Una gran parte de las aplicaciones que se construyen hoy en día, requieren de un API para funcionar, dicha API ofrece todos los servicios necesarios para que la aplicación puede interactuar con el Backend y así afectar la información de la base de datos, sin embargo, de esa gran cantidad de aplicaciones que se conectan [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/09/24/service-discovery-pattern-para-microservicios/">Service Discovery pattern para microservicios</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="aligncenter wp-image-2335 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/banner-1024x574.jpg" alt="Service Discovery y Service Registry" width="648" height="363" /></p>
<p>Una gran parte de las aplicaciones que se construyen hoy en día, requieren de un API para funcionar, dicha API ofrece todos los servicios necesarios para que la aplicación puede interactuar con el Backend y así afectar la información de la base de datos, sin embargo, de esa gran cantidad de aplicaciones que se conectan con APIs, requieren saber exactamente donde está alojado (IP y puerto) cada uno de los servicios que conforman el ecosistema de microservicios, es allí donde entra el Service Discovery pattern para solucionar ese tipo de dependencias.<span id="more-2322"></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>Arquitectura tradicional</h2>
<p>Para comprender exactamente cómo funciona el patrón Service Discovery es necesario entender cómo es que las aplicaciones que se conectan a un API normalmente:</p>
<figure id="attachment_2323" aria-describedby="caption-attachment-2323" style="width: 974px" class="wp-caption aligncenter"><img loading="lazy" class="wp-image-2323 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/client-configuration.png" alt="Configuración desde el cliente" width="974" height="486" /><figcaption id="caption-attachment-2323" class="wp-caption-text">Configuración desde el cliente</figcaption></figure>
<p>Si analizamos la imagen anterior, nos podemos dar cuenta que la aplicación (APP) requiere leer una configuración local para saber dónde están alojados los servicios, este almacenamiento puedes ser un archivo de propiedades, una base de datos local o cualquier medio de persistencia. Una vez que la aplicación sabe dónde están los servicios, entonces ahora si realiza una llanada a ellos.</p>
<p>&nbsp;</p>
<p>Una vez analizada la arquitectura pasada, veamos qué pasa si más aplicaciones son dependientes de los mismos servicios:</p>
<figure id="attachment_2324" aria-describedby="caption-attachment-2324" style="width: 1013px" class="wp-caption aligncenter"><img loading="lazy" class="wp-image-2324 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/multiclient-configuration.png" alt="Configuración multi-cliente" width="1013" height="486" /><figcaption id="caption-attachment-2324" class="wp-caption-text">Configuración multi-cliente</figcaption></figure>
<p>En esta arquitectura podemos ver que tenemos 3 aplicaciones que dependen de los mismos servicios, y cada uno de ellos tiene su configuración para determinar dónde están los servicios. Ahora imagina que algún servicio cambia de puerto o de dirección IP, lo cual es muy frecuente en una arquitectura Cloud donde la IP es flotante.</p>
<figure id="attachment_2325" aria-describedby="caption-attachment-2325" style="width: 974px" class="wp-caption aligncenter"><img loading="lazy" class="wp-image-2325 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/service-change-location.png" alt="Cambio de dirección del servicio" width="974" height="486" /><figcaption id="caption-attachment-2325" class="wp-caption-text">Cambio de dirección del servicio</figcaption></figure>
<p>Tras cambiar la dirección (IP y puerto) del servicio, la aplicación empezará a fallar de forma inmediata, pues en su configuración le seguirá diciendo que el servicio está todavía en la antigua dirección, lo que nos obligará a cambiar a actualizar la configuración en todas las aplicaciones para apuntar a la nueva ruta del servicio.</p>
<p>&nbsp;</p>
<p>Por otro lado, tenemos el caso de que tengamos más de una instancia del mismo servicio:</p>
<figure id="attachment_2326" aria-describedby="caption-attachment-2326" style="width: 648px" class="wp-caption aligncenter"><img loading="lazy" class="wp-image-2326 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/multi-instance-1024x360.png" alt="Multi instancias de un mismo servicio" width="648" height="228" /><figcaption id="caption-attachment-2326" class="wp-caption-text">Múltiples instancias de un mismo servicio</figcaption></figure>
<p>En estos casos, es posible que optemos por meter un balanceador de cargas, de tal forma que nosotros solo necesitamos comunicarnos con él, y será el balanceador quien finalmente reenvíe la petición a la instancia correspondiente. Este escenario es bastante prometedor y muchas aplicaciones funcionan así, pero aquí también tenemos el problema anterior, ¿qué pasa si una instancia cambia de dirección?, en este escenario no habría tanto problema, porque el balanceador redirigiría la petición a otra instancia, pero entonces ya solo nos quedamos con dos instancias operando, para resolver este problema, un administrador de servidores tiene que ir a la configuración del balanceador de cargas y actualizar con la nueva dirección del servicio. Como podemos ver, en esta arquitectura estamos más protegidos contra la falla o cambio de dirección de una instancia, sin embargo, el problema de la ruta física del servicio continua allí.</p>
<p>&nbsp;</p>
<p>Y finalmente, el escenario más interesante de todos, imagina que tu arquitectura está funcionando muy bien, nada está fallando, pero el número de usuarios está en alza y requieres agregar una nueva instancia para soportar la carga, en tal caso tendrías que levantar una nueva instancia del servicio y nuevamente actualizar el balanceador de cargas para agregar el nuevo servicio.</p>
<p>&nbsp;</p>
<p>Puede que esta arquitectura no tenga nada de extraño, incluso, es posible que algunas de las aplicaciones que estamos actualmente desarrollando estén configuradas de esta forma, pero entonces ¿qué tiene de malo utilizar esta arquitectura? Esta arquitectura no es que sea precisamente mala, pero tiene grandes inconvenientes que se acentúan a medida que migramos a una arquitectura de microservicios y tenesmos cada vez un número más grande de servicios, incluso, podemos tener más de una instancia de cada servicio.</p>
<p>&nbsp;</p>
<h2>Service Discovery pattern</h2>
<p>&nbsp;</p>
<p>Qué pasaría si no fuera necesario indicar en nuestras aplicaciones donde están físicamente los servicios y que, en lugar en su lugar, sean los mismos servicios que nos digan donde están físicamente, pues bien, eso es precisamente lo que nos propone el patrón Service Discovery.</p>
<p>La idea central de esta patrona es que todos los servicios cuando inician, se registran ante una entidad llamada Service Registry, el cual lleva el control de todos los servicios activos. De tal forma que cuando nosotros queremos consumir un servicio, buscamos en el Service Registry las instancias disponibles. Suena extraño esto que estoy diciendo, pero vallamos por partes, veamos como un servicio se registra:</p>
<figure id="attachment_2327" aria-describedby="caption-attachment-2327" style="width: 648px" class="wp-caption aligncenter"><img loading="lazy" class="wp-image-2327 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/service-registry-1024x431.png" alt="Service Registry patterns" width="648" height="273" /><figcaption id="caption-attachment-2327" class="wp-caption-text">Service Registry patterns</figcaption></figure>
<p>En la imagen se puede apreciar como cada servicio se registra de forma individual, indicándole por lo menos, su nombre y la dirección en la que se encuentra el servicio, de esta forma, el Service Registry tiene un registro de todos los servicios que están disponibles. Adicional al registro inicial, los servicios tienen que mandar señales de vida cada X tiempo para que el Service Registry sepa que el servicio continúa disponible, ha esto se le conoce como heartbeat (latidos).</p>
<figure id="attachment_2328" aria-describedby="caption-attachment-2328" style="width: 648px" class="wp-caption aligncenter"><img loading="lazy" class="wp-image-2328 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/heardbeat-1024x431.png" alt="Service Registry pattern heardbeat" width="648" height="273" /><figcaption id="caption-attachment-2328" class="wp-caption-text">Service Registry pattern heardbeat</figcaption></figure>
<p>&nbsp;</p>
<p>Si un servicio no se reportar (heartbeat), el Service Registry sabrá que hay algo mal en ese servicio y asumirá que no está disponible, por lo que todas las peticiones serán redirigidas a las demás instancias. Adicional, es posible que el Service Registry nos mande notificaciones cuando un servicio no está disponible para poder actuar en consecuencia.</p>
<p>&nbsp;</p>
<p>Ya que hemos comprendido que es un Service Registry, continuaremos hablando del patrón Service Discovery. Este patrón nos permite ejecutar un servicio determinado sin conocer la dirección física del servicio, para esto, utilizamos un balanceador de cargas que se apoyará del Service Registry para conocer la ubicación real del servicio.</p>
<figure id="attachment_2329" aria-describedby="caption-attachment-2329" style="width: 648px" class="wp-caption aligncenter"><img loading="lazy" class="wp-image-2329 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/service-discovery-1024x463.png" alt="Arquitectura utilizando el patrón Service Discovery" width="648" height="293" /><figcaption id="caption-attachment-2329" class="wp-caption-text">Arquitectura utilizando el patrón Service Discovery</figcaption></figure>
<p>Esta nueva arquitectura funciona de la siguiente manera, primero que nada, los servicios se registrarán ante el Service Registry, con la finalidad de saber qué servicios tenemos disponibles, por otra parte, los clientes ejecutarán llamadas a los servicios por medio del balanceador de cargas, el cual se apoyará del Service Registry para determinar la dirección física del servicio y redireccionar la petición a la instancia correcta del servicio.</p>
<p>En esta nueva arquitectura, podemos ver los componentes que ya conocíamos, como los servicios, el Service Registry, el Balanceador de cargas y los clientes, por lo que seguramente te estés preguntando, que tiene de diferente esta arquitectura con la que hablamos al principio. Bueno la diferencia es muy grande, aunque de entrada no quede muy clara. Para empezar, ya no tenemos la necesidad de conocer la dirección física de los servicios, pues ellos mismo se registran al iniciar y nos permite saber su estado mediante el heartbeat, por otro lado, si aprovisionamos una nueva instancia de un servicio, este se registrará de forma automática ante el Service Registry, por lo que no habrá necesidad la configuración de ningún componente.</p>
<p>Por otro lado, el balanceador de cargas puede estar ubicado en dos puntos diferentes, a estas dos variantes se les conoce como Server-Side (del lado del servidor) o Client-Side (del lado del cliente). Debido a que cada uno tiene sus ventajas y desventajas, las analizaremos por separado:</p>
<p>&nbsp;</p>
<h3>Client-Side</h3>
<p>&nbsp;</p>
<p>En esta variante, el balanceador de cargas se ubica directamente sobre la aplicación, de tal forma que no requiere realizar una llamada remota al balanceador, en su lugar, la implementación local del Balanceador se comunicará con el Service Registry para obtener las instancias disponibles, y luego, desde la misma aplicación, se seleccionará la instancia a ser consumida.</p>
<figure id="attachment_2330" aria-describedby="caption-attachment-2330" style="width: 648px" class="wp-caption aligncenter"><img loading="lazy" class="wp-image-2330 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/client-side-1024x463.png" alt="Service Discovery utilizando Client-Side load balancer" width="648" height="293" /><figcaption id="caption-attachment-2330" class="wp-caption-text">Service Discovery utilizando Client-Side load balancer</figcaption></figure>
<p>Esta arquitectura puede verse algo confusa, pues parece un plato de espagueti, ya que cada aplicación se puede comunicar directamente con cada instancia de los servicios disponible, provocando que visualmente se vea más complicado de lo que parece.</p>
<p>Ventajas</p>
<ol>
<li>No existen tantos puntos móviles, lo que evita tener que depender un balanceador externo.</li>
<li>Es más fácil de administrar, pues no es necesario administrar un balanceador externo</li>
<li>Dado que cada cliente implementa su propio balanceador, se evita un único punto de fallo.</li>
</ol>
<p>Desventajas</p>
<ol>
<li>Debido a que se une el cliente con el balanceador, hay que implementar el balanceador en cada aplicación que sea necesario.</li>
<li>Es necesario implementar la lógica de descubrimiento de servicios en el cliente.</li>
</ol>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3>Server-Side</h3>
<p>&nbsp;</p>
<p>En esta arquitectura, el balanceador de cargas es un componente externo, al cual todos los clientes se conectan, de esta forma, cuando una petición llega, el balanceador será el encargado de buscar la instancia adecuada por medio del Service Registry.</p>
<figure id="attachment_2331" aria-describedby="caption-attachment-2331" style="width: 648px" class="wp-caption aligncenter"><img loading="lazy" class="wp-image-2331 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/server-side-1024x463.png" alt="Service Discovery utilizando Server-Side load balancer" width="648" height="293" /><figcaption id="caption-attachment-2331" class="wp-caption-text">Service Discovery utilizando Server-Side load balancer</figcaption></figure>
<p>Esta arquitectura es visiblemente más limpia, pues los clientes solo se comunican con el balanceador de cargar y él se encargará se redirigir la petición al servicio adecuado. En esta arquitectura, el cliente no se preocupa por el descubrimiento de los servicios ni de balancear la carga entre las diferentes instancias de un mismo servicio. Adicional, es posible tener un cluster de Balanceadores de carga para evitar un único punto de fallo.</p>
<p>Ventajas:</p>
<ol>
<li>Desacoplamos la responsabilidad del balanceo y descubrimiento de servicios por parte del cliente</li>
<li>Evitando tener que desarrollar esta funcionalidad en cada cliente.</li>
</ol>
<p>Desventajas:</p>
<ol>
<li>Es necesario administrar el balanceador de cargar, lo que puede llevar una carga administrativa adicional.</li>
<li>Si no se configura adecuadamente, puede crear un único punto de fallo, provocando que todo el ecosistema falle.</li>
</ol>
<p>&nbsp;</p>
<p>&nbsp;</p>
<figure id="attachment_2333" aria-describedby="caption-attachment-2333" style="width: 1745px" 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-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/patrones-diseño-banner.jpg" alt="¿Quieres aprender más patrones de diseño interesantes como este? te invito a que veas mi libro." width="1745" height="668" /></a><figcaption id="caption-attachment-2333" class="wp-caption-text">¿Quieres aprender más patrones de diseño interesantes como este? te invito a que veas mi libro.</figcaption></figure>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>Como implementar este patrón</h2>
<p>&nbsp;</p>
<p>Un patrón solo define como las aplicaciones deberían de funcionar, pero da carta abierta al programador sobre cómo se debe de implementar, es por eso no existe una sola forma o tecnología para implementar este patrón, por lo que tu podrás desarrollar cada pieza o utilizar algunas herramientas que ya existen en el mercado, donde sin duda, <a href="https://www.oscarblancarteblog.com/2018/07/17/spring-boot-relacion-los-microservicios/">Spring Boot</a> + Netflix OSS son las tecnologías más innovadoras y fáciles de implementar.</p>
<p>&nbsp;</p>
<p>Algunas alternativas para el Registro de servicios son:</p>
<ul>
<li><a href="https://netflix.github.io/">Eureka</a>: Parte de Netflix OSS, un conjunto de utilidades desarrolladas por Netflix y liberadas como código abierto.</li>
</ul>
<ul>
<li><a href="https://github.com/etcd-io/etcd">Etcd</a>: un almacén de valores-clave distribuido, consistente y de alta disponibilidad que se utiliza para la configuración compartida y el descubrimiento de servicios.</li>
<li><a href="https://www.consul.io/">Consul</a>: una herramienta para descubrir y configurar servicios. Proporciona una API que permite a los clientes registrarse y descubrir servicios. El cónsul puede realizar controles de salud para determinar la disponibilidad del servicio.</li>
<li><a href="http://zookeeper.apache.org/">Apache Zookeeper</a>: un servicio de coordinación de alto rendimiento y uso generalizado para aplicaciones distribuidas.</li>
</ul>
<p>Algunas alternativas para el balanceo de cargas:</p>
<ul>
<li><a href="https://github.com/Netflix/ribbon">Ribbon</a>: Parte del stack tecnológico de Netflix OSS. El cual permite realizar el balanceo de cargar por medio de Eureka.</li>
<li><a href="https://www.nginx.com/">Nginx</a>: pronunciado como “engine-ex”, es un servidor web de código abierto que, desde su éxito inicial como servidor web, ahora también es usado como proxy inverso, cache de HTTP, y balanceador de carga.</li>
</ul>
<p>&nbsp;</p>
<h2>Conclusiones</h2>
<p>Como hemos podido analizar a lo largo de este artículo, el patrón Service Discovery es uno de los patrones más potentes en arquitecturas de microservicios altamente escalable y que permite librarnos de configurar las direcciones físicas de los servicios, algo sumamente valorado en ambientes cloud, donde tenemos IP flotantes que pueden cambiar de la noche a la mañana o que simplemente requieren del aprovisionamiento dinámico de nuevas instancias.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;		</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/09/24/service-discovery-pattern-para-microservicios/">Service Discovery pattern para microservicios</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/2018/09/24/service-discovery-pattern-para-microservicios/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2322</post-id>	</item>
		<item>
		<title>Patrón Factory Method – Proyecto [Segunda parte] [Video]</title>
		<link>https://www.oscarblancarteblog.com/2018/08/15/patron-factory-method-proyecto-segunda-parte-video/</link>
					<comments>https://www.oscarblancarteblog.com/2018/08/15/patron-factory-method-proyecto-segunda-parte-video/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 16 Aug 2018 00:05:48 +0000</pubDate>
				<category><![CDATA[Patrones de Diseño]]></category>
		<category><![CDATA[arquitectura]]></category>
		<category><![CDATA[Patrones de diseño]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2247</guid>

					<description><![CDATA[<p>Este video es la continuación del video de introducción a al patrón Factory Method. En esta segunda entrega aprenderemos a utilizar el patrón mediante in ejemplo del mundo real, en el cual aprenderemos a crear una aplicación que permite conectarse a más de una base de datos, la cual podrá ser intercambiada por medio de [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/08/15/patron-factory-method-proyecto-segunda-parte-video/">Patrón Factory Method – Proyecto [Segunda parte] [Video]</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>				<iframe class='youtube-player' width='648' height='365' src='https://www.youtube.com/embed/8sJai15H0iA?version=3&#038;rel=1&#038;fs=1&#038;autohide=2&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' allowfullscreen='true' style='border:0;'></iframe></p>
<p>Este video es la continuación del video de <a href="https://www.oscarblancarteblog.com/2018/08/01/patron-factory-method-introduccion/">introducción a al patrón Factory Method</a>. En esta segunda entrega aprenderemos a utilizar el patrón mediante in ejemplo del mundo real, en el cual aprenderemos a crear una aplicación que permite conectarse a más de una base de datos, la cual podrá ser intercambiada por medio de la configuración.		</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/08/15/patron-factory-method-proyecto-segunda-parte-video/">Patrón Factory Method – Proyecto [Segunda parte] [Video]</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/2018/08/15/patron-factory-method-proyecto-segunda-parte-video/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2247</post-id>	</item>
		<item>
		<title>Patrón Factory Method &#8211; Introducción [Primera parte] [Video]</title>
		<link>https://www.oscarblancarteblog.com/2018/08/01/patron-factory-method-introduccion/</link>
					<comments>https://www.oscarblancarteblog.com/2018/08/01/patron-factory-method-introduccion/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Wed, 01 Aug 2018 23:28:23 +0000</pubDate>
				<category><![CDATA[Patrones de Diseño]]></category>
		<category><![CDATA[arquitectura]]></category>
		<category><![CDATA[Patrones de diseño]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2155</guid>

					<description><![CDATA[<p>En este video te enseñare la teoría que hay detrás del patrón Factory Method, este patrón permite la creación de objetos de un subtipo determinado a través de una clase Factory. Esto es especialmente útil cuando no sabemos, en tiempo de diseño, el subtipo que vamos a utilizar o cuando queremos delegar la lógica de [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/08/01/patron-factory-method-introduccion/">Patrón Factory Method &#8211; Introducción [Primera parte] [Video]</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>				<iframe class='youtube-player' width='648' height='365' src='https://www.youtube.com/embed/vb8gH4Ry7J8?version=3&#038;rel=1&#038;fs=1&#038;autohide=2&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' allowfullscreen='true' style='border:0;'></iframe></p>
<p>En este video te enseñare la teoría que hay detrás del patrón Factory Method, este patrón permite la creación de objetos de un subtipo determinado a través de una clase Factory. Esto es especialmente útil cuando no sabemos, en tiempo de diseño, el subtipo que vamos a utilizar o cuando queremos delegar la lógica de creación de los objetos a una clase Factory. Utilizando este patrón podemos crear instancias dinámicamente mediante la configuración, estableciendo cual será la implementación a utilizar en un archivo de texto, XML, properties o mediante cualquier otra estrategia.<span id="more-2155"></span></p>
<p>Puedes ver la segunda parte en <a href="https://youtu.be/8sJai15H0iA">aquí</a>		</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/08/01/patron-factory-method-introduccion/">Patrón Factory Method &#8211; Introducción [Primera parte] [Video]</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/2018/08/01/patron-factory-method-introduccion/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2155</post-id>	</item>
		<item>
		<title>Introducción a los patrones de diseño (video)</title>
		<link>https://www.oscarblancarteblog.com/2018/04/02/introduccion-los-patrones-diseno-video/</link>
					<comments>https://www.oscarblancarteblog.com/2018/04/02/introduccion-los-patrones-diseno-video/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Mon, 02 Apr 2018 20:45:19 +0000</pubDate>
				<category><![CDATA[Patrones de Diseño]]></category>
		<category><![CDATA[Patrones de diseño]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2050</guid>

					<description><![CDATA[<p>En esta charla explicaré la importancia de los patrones de diseño, así como las ventajas que te traerá en tu crecimiento personal. De la misma forma, analizaremos como los patrones de diseño, son la base para convertirte en un arquitecto de software y aremos un análisis de los salarios que pueden alcanzar.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/04/02/introduccion-los-patrones-diseno-video/">Introducción a los patrones de diseño (video)</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>				<iframe class='youtube-player' width='648' height='365' src='https://www.youtube.com/embed/rrcCv8wwnlE?version=3&#038;rel=1&#038;fs=1&#038;autohide=2&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' allowfullscreen='true' style='border:0;'></iframe></p>
<p>En esta charla explicaré la importancia de los patrones de diseño, así como las ventajas que te traerá en tu crecimiento personal. De la misma forma, analizaremos como los patrones de diseño, son la base para convertirte en un arquitecto de software y aremos un análisis de los salarios que pueden alcanzar.		</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/04/02/introduccion-los-patrones-diseno-video/">Introducción a los patrones de diseño (video)</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/2018/04/02/introduccion-los-patrones-diseno-video/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2050</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>
	</channel>
</rss>
