




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

<channel>
	<title>Software Guisho &#187; pattern</title>
	<atom:link href="http://software.guisho.com/software/pattern/feed" rel="self" type="application/rss+xml" />
	<link>http://software.guisho.com</link>
	<description>Hablemos un poco de software con ñ.</description>
	<lastBuildDate>Thu, 10 Nov 2011 22:50:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Abstract Factory Pattern &#8211; Patrones</title>
		<link>http://software.guisho.com/abstract-factory-pattern-patrones</link>
		<comments>http://software.guisho.com/abstract-factory-pattern-patrones#comments</comments>
		<pubDate>Wed, 06 May 2009 03:53:26 +0000</pubDate>
		<dc:creator>guisho (Luis H. Fernandez)</dc:creator>
				<category><![CDATA[Buenas prácticas - Mejores Prácticas]]></category>
		<category><![CDATA[Patrones Creacionales]]></category>
		<category><![CDATA[Patrones de diseño]]></category>
		<category><![CDATA[abstract factory pattern]]></category>
		<category><![CDATA[patrones]]></category>
		<category><![CDATA[pattern]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=86</guid>
		<description><![CDATA[
<div style="float: right; padding-left: 5px;" class="twitterbutton"><a href="http://twitter.com/share?url=http://software.guisho.com/abstract-factory-pattern-patrones&amp;text=Abstract Factory Pattern &#8211; Patrones&amp;via=lhernandez&amp;related=guishogt"><img align="right" src="http://software.guisho.com/wp-content/plugins//easy-twitter-button/i/buttons/es/tweetn.png" style="border: none;" alt="" /></a></div>
Hace una semana hablamos del Factory Pattern, que realmente se llama Factory Method Pattern, porque como vimos se trata de reducir la desición de la creación de una instancia a un método, pero que por gusto mío lo pusimos en una clase Factory con un método abstracto. Ahora vamos a hablar del Abstract Factory Pattern, [...]


Related posts:<ol><li><a href='http://software.guisho.com/patrones-de-diseno-factory-pattern' rel='bookmark' title='Permanent Link: Factory Pattern &#8211; Patrones'>Factory Pattern &#8211; Patrones</a></li>
<li><a href='http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno' rel='bookmark' title='Permanent Link: Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño'>Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño</a></li>
<li><a href='http://software.guisho.com/singleton-pattern-patrones-de-diseno' rel='bookmark' title='Permanent Link: Singleton Pattern &#8212; Patrones de diseño'>Singleton Pattern &#8212; Patrones de diseño</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div style="float: right; padding-left: 5px;" class="twitterbutton"><a href="http://twitter.com/share?url=http://software.guisho.com/abstract-factory-pattern-patrones&amp;text=Abstract Factory Pattern &#8211; Patrones&amp;via=lhernandez&amp;related=guishogt"><img align="right" src="http://software.guisho.com/wp-content/plugins//easy-twitter-button/i/buttons/es/tweetn.png" style="border: none;" alt="" /></a></div>
<p><a href="http://software.guisho.com/wp-content/uploads/2009/05/factory.jpg"><img class="alignleft size-medium wp-image-124" title="factory" src="http://software.guisho.com/wp-content/uploads/2009/05/factory-199x300.jpg" alt="factory" width="199" height="300" /></a>Hace una semana hablamos del Factory Pattern, que realmente se llama Factory Method Pattern, porque como vimos se trata de reducir la desición de la creación de una instancia a un método, pero que por gusto mío lo pusimos en una clase Factory con un método abstracto. Ahora vamos a hablar del Abstract Factory Pattern, que va un paso más alla: el Abstract Factory Method agrupa varios Factory Methods.</p>
<p>Básicamente lo que hace el este patrón es unir varios Factory Methods, delegando la responsabilidad total sobre qué instancias crear a partir de datos comunes. La semana pasada hicimos un pequeño traductor, que al recibir un número desplegaba su valor en español, inglés o alemán. Para mostrar el concepto del Abstract Factory vamos a extender el ejemplo.<span id="more-86"></span></p>
<p>Primero vamos hacer un sencillo reloj que nos muestra la hora actual. Como sabemos, la hora puede ser desplegada en formato de 24Hrs o puede ser desplegada en formato AM/PM. Recordando que es a manera de ejemplo, vamos a utilizar la clase Date de una manera que no se debe, y probablemente el reloj lo haríamos de una manera más sencilla, pero para nuestro ejemplo queda perfecta su uso. Como en el caso del diccionario, haremos una clase abstracta de Reloj y dos implementaciones para cada una de los formatos, y una clase que contenga el método del Factory Method. La cosa quedaría algo así:</p>
<p>La clase Reloj:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">class</span> Reloj <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #003399;">String</span> dameLaHora<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>La clase que se da la hora en formato AM/PM:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> RelojAmPm <span style="color: #000000; font-weight: bold;">extends</span> Reloj<span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> RelojAmPm<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> dameLaHora<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">Date</span> d <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Date</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> hora <span style="color: #339933;">=</span> d.<span style="color: #006633;">getHours</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> minutos <span style="color: #339933;">=</span> d.<span style="color: #006633;">getMinutes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> segundos <span style="color: #339933;">=</span> d.<span style="color: #006633;">getSeconds</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">String</span> tr<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>hora<span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;=</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            tr<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;Son las &quot;</span><span style="color: #339933;">+</span>hora<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;:&quot;</span><span style="color: #339933;">+</span>minutos<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;:&quot;</span><span style="color: #339933;">+</span>segundos<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot; AM&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
            tr<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;Son las &quot;</span><span style="color: #339933;">+</span><span style="color: #009900;">&#40;</span>hora<span style="color: #339933;">-</span><span style="color: #cc66cc;">12</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;:&quot;</span><span style="color: #339933;">+</span>minutos<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;:&quot;</span><span style="color: #339933;">+</span>segundos<span style="color: #339933;">+</span><span style="color: #0000ff;">&quot; PM&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">return</span> tr<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>La que nos da la hora en formato de 24 horas:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Reloj24Hrs <span style="color: #000000; font-weight: bold;">extends</span> Reloj <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> dameLaHora<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">Date</span> d <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Date</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> hora <span style="color: #339933;">=</span> d.<span style="color: #006633;">getHours</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> minutos <span style="color: #339933;">=</span> d.<span style="color: #006633;">getMinutes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> segundos <span style="color: #339933;">=</span> d.<span style="color: #006633;">getSeconds</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">String</span> tr<span style="color: #339933;">;</span>
        tr <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Son las &quot;</span> <span style="color: #339933;">+</span> hora <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;:&quot;</span> <span style="color: #339933;">+</span> minutos <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;:&quot;</span> <span style="color: #339933;">+</span> segundos <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; &quot;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">return</span> tr<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Nuestra clase que contiene la el método que elije las instancias. A diferencia del post anterior, ahora el parámetro que recibe el método es un entero, que acepta los enteros especificados como constantes estáticas en la clase. Esto se usa mucho para no estar adivinando los paráemetros que acepta el método:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> RelojFactory <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">int</span> RELOJ_AM_PM<span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">int</span> RELOJ_24_HRS<span style="color: #339933;">=</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> RelojFactory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> Reloj createReloj<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> tipoDeReloj<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>tipoDeReloj<span style="color: #339933;">==</span>RelojFactory.<span style="color: #006633;">RELOJ_24_HRS</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> Reloj24Hrs<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>tipoDeReloj<span style="color: #339933;">==</span>RelojFactory.<span style="color: #006633;">RELOJ_AM_PM</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> RelojAmPm<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Y finalmente la clase cliente, que será la usuario final:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MainClient <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        Reloj r <span style="color: #339933;">=</span> RelojFactory.<span style="color: #006633;">createReloj</span><span style="color: #009900;">&#40;</span>RelojFactory.<span style="color: #006633;">RELOJ_24_HRS</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>r.<span style="color: #006633;">dameLaHora</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Hasta aquí tenemos dos fábricas: una de palabras, y la que acabamos de hacer que nos da la hora. En un proyecto cualquiera se nos pide hacer un sistema que despliegue la hora y los números de la manera en la que se expresan en cada país (una implementación súper elemental de Locale de Java). Vamos con dos ejemplos prácticos. En Estados Unidos se despliegan los números en inglés, y la hora en formato AM/PM; mientras que en Guatemala se dicen los números en español y la hora en formato de 24 Horas.</p>
<p>Ahora vamos a crear una Abstract Factory, que le pondremos Locale.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">class</span> AbstractLocaleFactory <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> US<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;ESTADOS_UNIDOS&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> GT<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;GUATEMALA&quot;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003399;">String</span> pais<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> Traductor createTraductor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> Reloj createReloj<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getPais<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">pais</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setPais<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> pais<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">pais</span> <span style="color: #339933;">=</span> pais<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Como ven esta fabrica tiene un par de métodos que devuelven un Reloj y un Traductor. Noten que Reloj y Traductor son a su vez clases abstractas.</p>
<p>Ahora implementamos nuestra clase LocaleGuatemalaFactory, que va así:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> LocaleGuatemalaFactory <span style="color: #000000; font-weight: bold;">extends</span> AbstractLocaleFactory<span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> LocaleGuatemalaFactory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">pais</span><span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">GT</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">public</span> Traductor createTraductor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> TraductorFactory.<span style="color: #006633;">createTraductor</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;espanol&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> Reloj createReloj<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> RelojFactory.<span style="color: #006633;">createReloj</span><span style="color: #009900;">&#40;</span>RelojFactory.<span style="color: #006633;">RELOJ_24_HRS</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Y la respectiva para Estados Unidos:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> LocaleEstadosUnidosFactory <span style="color: #000000; font-weight: bold;">extends</span> AbstractLocaleFactory<span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> LocaleEstadosUnidosFactory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">pais</span><span style="color: #339933;">=</span>AbstractLocaleFactory.<span style="color: #006633;">US</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> Traductor createTraductor<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> TraductorFactory.<span style="color: #006633;">createTraductor</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ingles&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> Reloj createReloj<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> RelojFactory.<span style="color: #006633;">createReloj</span><span style="color: #009900;">&#40;</span>RelojFactory.<span style="color: #006633;">RELOJ_AM_PM</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ahora en el cliente, si queremos las cosas como se verían en Guatemala, simplemente hacemos esto.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MainClient <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        Reloj reloj <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
        Traductor traductor <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
        AbstractLocaleFactory localeFactory <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> LocaleGuatemalaFactory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        reloj <span style="color: #339933;">=</span> localeFactory.<span style="color: #006633;">createReloj</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        traductor <span style="color: #339933;">=</span> localeFactory.<span style="color: #006633;">createTraductor</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;--------&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;1=&quot;</span><span style="color: #339933;">+</span>traductor.<span style="color: #006633;">traducirNumero</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>reloj.<span style="color: #006633;">dameLaHora</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>El resultado de correr el codigo anterior es:<br />
<strong><br />
1=uno<br />
Son las 21:50:17<br />
</strong></p>
<p>Ahora si cambiamos la linea</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">        AbstractLocaleFactory localeFactory <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> LocaleGuatemalaFactory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Por esta</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">        AbstractLocaleFactory localeFactory <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> LocaleEstadosUnidosFactory<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Tendremos como resultado:<br />
<strong><br />
1=one<br />
9:52:56 PM<br />
</strong></p>
<p>Aquí es un ejemplo sencillo. Pero imaginen quedemos hacer un Locale para cada país, y en el locale tener más cosas como: la nomenclatura de moneda, el sistema de numeración, el manejo de fechas, kilómetros o millas, etc. Con el Abstract Factory Pattern es muy sencillo agregar cada nuevo pais, o cada nueva característica del Locale. Pero sobre todo el código es MUY legible y FACILMENTE extensible. Alguien que nunca ha visto estas piezas de código puede entender como hacer un nuevo país.</p>
<p>Entonces, el Abstract Factory Pattern puede ayudarnos mucho en casos donde hemos de manejar familias de objetos. Al inicio no siempre es obvia su implementación, pero siempre está el recurso de del refactoring, en el cual salen nuevas maneras sencillas de hacer las cosas. Este, como muchos patrones, requieren escribir un poco más de código al principio, pero nos reducen el esfuerzo a largo plazo porque hay menos código repetido.</p>
<p><a href="http://software.guisho.com/wp-content/uploads/2009/05/abstractfactory.zip">Aquí el código</a> de este patrón.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://software.guisho.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>

<p>Related posts:<ol><li><a href='http://software.guisho.com/patrones-de-diseno-factory-pattern' rel='bookmark' title='Permanent Link: Factory Pattern &#8211; Patrones'>Factory Pattern &#8211; Patrones</a></li>
<li><a href='http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno' rel='bookmark' title='Permanent Link: Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño'>Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño</a></li>
<li><a href='http://software.guisho.com/singleton-pattern-patrones-de-diseno' rel='bookmark' title='Permanent Link: Singleton Pattern &#8212; Patrones de diseño'>Singleton Pattern &#8212; Patrones de diseño</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/abstract-factory-pattern-patrones/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

