




<?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; interfaces fluídas</title>
	<atom:link href="http://software.guisho.com/software/interfaces-fluidas/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>Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño</title>
		<link>http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno</link>
		<comments>http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno#comments</comments>
		<pubDate>Fri, 29 May 2009 18:27:10 +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[builder pattern]]></category>
		<category><![CDATA[constructor encadenado]]></category>
		<category><![CDATA[fluid interface]]></category>
		<category><![CDATA[interfaces fluídas]]></category>
		<category><![CDATA[patron builder]]></category>
		<category><![CDATA[patron constructor]]></category>
		<category><![CDATA[patrones]]></category>
		<category><![CDATA[patrones creacionales]]></category>

		<guid isPermaLink="false">http://software.guisho.com/?p=104</guid>
		<description><![CDATA[
<div style="float: right; padding-left: 5px;" class="twitterbutton"><a href="http://twitter.com/share?url=http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno&amp;text=Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño&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>
El builder pattern, o patrón de construcción, es uno más de los patrones creacionales de diseño. En términos generales un builder esconde los detalles de la creación de un objeto final que se llama producto. Hay varios métodos para lograr esto, y por ello hay varias &#8220;implementaciones&#8221; de este patrón que en nada coinciden , [...]


Related posts:<ol><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>
<li><a href='http://software.guisho.com/abstract-factory-pattern-patrones' rel='bookmark' title='Permanent Link: Abstract Factory Pattern &#8211; Patrones'>Abstract Factory Pattern &#8211; Patrones</a></li>
<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>
</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/builder-pattern-interfaces-fluidas-patrones-de-diseno&amp;text=Builder Pattern, Interfaces Fluidas&#8211; Patrones de diseño&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><img class="alignleft size-medium wp-image-117" title="lego" src="http://software.guisho.com/wp-content/uploads/2009/05/lego.jpg" alt="lego" width="300" height="199" /></p>
<p>El builder pattern, o patrón de construcción, es uno más de los patrones creacionales de diseño. En términos generales un builder esconde los detalles de la creación de un objeto final que se llama producto. Hay varios métodos para lograr esto, y por ello hay varias &#8220;implementaciones&#8221; de este patrón que en nada coinciden , salvo en el nombre. El clásico, usado en el GoF es un poco más complejo del que vamos a ver ahora, pero no se asusten, ya tendremos la oportunidad de aprenderlo. En esta ocasión nos vamos a enfocar en un builder que se llaman interfaces fluídas (fluid interfaces).<span id="more-104"></span></p>
<p>Y seguimos con la política de que la mejor manera de entender, y de aprender, es con un ejemplo. Estuve dándole vueltas a un buen caso para ejemplificar y se me ocurrió este: supongamos que vamos a hacer un programa para una empresa que ofrece servicios de web hosting (alojamiento en web). Esta empresa tiene varios planes que ofrecer: tiene un plan personal, un plan bronce, uno plata, uno oro y finalmente el diamante. El personal ofrece un alojamiento de 10MB, una transferencia mensual de 100MB, una cuenta de correo electrónico y nada más. El bronce ofrece 100MB de alojamiento, 1000MB de transferencia mensual, 10 cuentas de correo electrónico. Así sucesivamente cada plan aumenta las cantidades de alojamiento, transferencia y cuentas de correo. A la cada plan agrega nuevas características. El plata ofrece acceso ssh, y una base de datos; el oro agrega estadísticas de sitio y panel de control. Así se van multiplicando las opciones, y para crear la aplicación definimos nuestro objeto que queda así:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.guisho.software.patrones.builder</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.math.BigDecimal</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
 *
 * @author guisho.com, luishernan@gmail.com
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> PaqueteDeHosting <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">/*Los siguientes campos son obligatorios siempre*/</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> nombre<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">BigDecimal</span> precioAnual<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> capacidadDeAlmacenamiento<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//en MB</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> transferenciaMensual<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//en MB</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> cantidadDireccionesCorreo<span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">/*Las siguientes son opcionales, hay planes que no los tienen*/</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> cantidadSitiosPermitidos<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> cantidadBaseDeDatos<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> codigoOferta<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">boolean</span> accesoSsh<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">boolean</span> panelDeControl<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">boolean</span> estadisticasDeSitio<span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">boolean</span> ipPublica<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHosting<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: #666666; font-style: italic;">/* mas constructores */</span>
    <span style="color: #666666; font-style: italic;">/* Setters, getters y demás código....*/</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Bien, ahora cada plan tiene una configuración previamente establecida, que el vendedor no arma en el momento, y que preferiblemente no puede cambiar. ¿Cómo hacemos para crear cada objeto? La primera manera que se nos ocurrirá es crear un constructor pada cada caso, manteniendo siempre los valores obligatorios. Tendríamos una colección de constructores como la siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHosting<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> nombre, <span style="color: #003399;">BigDecimal</span> precioAnual, <span style="color: #000066; font-weight: bold;">int</span> almacenamiento, <span style="color: #000066; font-weight: bold;">int</span> transferencia, <span style="color: #000066; font-weight: bold;">int</span> cantidadCorreos<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;">nombre</span> <span style="color: #339933;">=</span> nombre<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">precioAnual</span> <span style="color: #339933;">=</span> precioAnual<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">capacidadDeAlmacenamiento</span> <span style="color: #339933;">=</span> almacenamiento<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">transferenciaMensual</span> <span style="color: #339933;">=</span> transferencia<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">cantidadDireccionesCorreo</span> <span style="color: #339933;">=</span> cantidadCorreos<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHosting<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> nombre, <span style="color: #003399;">BigDecimal</span> precioAnual, <span style="color: #000066; font-weight: bold;">int</span> almacenamiento, <span style="color: #000066; font-weight: bold;">int</span> transferencia, <span style="color: #000066; font-weight: bold;">int</span> cantidadCorreos, <span style="color: #000066; font-weight: bold;">int</span> basesDatos<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;">nombre</span> <span style="color: #339933;">=</span> nombre<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">precioAnual</span> <span style="color: #339933;">=</span> precioAnual<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">capacidadDeAlmacenamiento</span> <span style="color: #339933;">=</span> almacenamiento<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">transferenciaMensual</span> <span style="color: #339933;">=</span> transferencia<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">cantidadDireccionesCorreo</span> <span style="color: #339933;">=</span> cantidadCorreos<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">cantidadBaseDeDatos</span> <span style="color: #339933;">=</span> basesDatos<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHosting<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> nombre, <span style="color: #003399;">BigDecimal</span> precioAnual, <span style="color: #000066; font-weight: bold;">int</span> almacenamiento, <span style="color: #000066; font-weight: bold;">int</span> transferencia, <span style="color: #000066; font-weight: bold;">int</span> cantidadCorreos, <span style="color: #003399;">String</span> ipPublica<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;">nombre</span> <span style="color: #339933;">=</span> nombre<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">precioAnual</span> <span style="color: #339933;">=</span> precioAnual<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">capacidadDeAlmacenamiento</span> <span style="color: #339933;">=</span> almacenamiento<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">transferenciaMensual</span> <span style="color: #339933;">=</span> transferencia<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">cantidadDireccionesCorreo</span> <span style="color: #339933;">=</span> cantidadCorreos<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">ipPublica</span> <span style="color: #339933;">=</span> ipPublica<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHosting<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> nombre, <span style="color: #003399;">BigDecimal</span> precioAnual, <span style="color: #000066; font-weight: bold;">int</span> almacenamiento, <span style="color: #000066; font-weight: bold;">int</span> transferencia, <span style="color: #000066; font-weight: bold;">int</span> cantidadCorreos, <span style="color: #003399;">String</span> ipPublica,<span style="color: #000066; font-weight: bold;">int</span> basesDatos<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;">nombre</span><span style="color: #339933;">=</span>nombre<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">precioAnual</span><span style="color: #339933;">=</span>precioAnual<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">capacidadDeAlmacenamiento</span><span style="color: #339933;">=</span>almacenamiento<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">transferenciaMensual</span><span style="color: #339933;">=</span>transferencia<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">cantidadDireccionesCorreo</span><span style="color: #339933;">=</span>cantidadCorreos<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">ipPublica</span><span style="color: #339933;">=</span>ipPublica<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">cantidadBaseDeDatos</span><span style="color: #339933;">=</span>basesDatos<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
....</pre></div></div>

<p>Como vemos solo hicimos un par de combinaciones con la cantidad de bases de datos y la ip pública. Mientras la cantidad de campos opcionales crece, la cantidad de constructores aumenta desmedidamente creando el ambiente ideal para que aparezcan errores.</p>
<p>Otro camino que se puede tomar es el clásico bean: un constructor vacío y setters para cada parámetro que deseamos agregar. Este método tiene un pequeño inconveniente: podemos dejar al objeto en un estado incosistente: podemos ponerle cuántas cuentas de correo pero no ponerle nombre, ni ponerle precio. ¿Qué hacemos entonces? Hacemos un Builder!! El builder se explicará por el solo. Veamos:</p>
<p>En PaqueteDeHosting hacemos un constructor con los campos que siempre van para evitar estados inconsistentes:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHosting<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> nombre, <span style="color: #003399;">BigDecimal</span> precioAnual, <span style="color: #000066; font-weight: bold;">int</span> almacenamiento, <span style="color: #000066; font-weight: bold;">int</span> transferencia, <span style="color: #000066; font-weight: bold;">int</span> cantidadCorreos<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;">nombre</span> <span style="color: #339933;">=</span> nombre<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">precioAnual</span> <span style="color: #339933;">=</span> precioAnual<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">capacidadDeAlmacenamiento</span> <span style="color: #339933;">=</span> almacenamiento<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">transferenciaMensual</span> <span style="color: #339933;">=</span> transferencia<span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">cantidadDireccionesCorreo</span> <span style="color: #339933;">=</span> cantidadCorreos<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Y creamos el builder</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.guisho.software.patrones.builder</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.math.BigDecimal</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
 *
 * @author guisho.com, luishernan@gmail.com
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> PaqueteDeHostingBuilder <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span>  PaqueteDeHosting paquete<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHostingBuilder<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> nombre, <span style="color: #003399;">BigDecimal</span> precio, <span style="color: #000066; font-weight: bold;">int</span> cantidadAlmacenamiento, <span style="color: #000066; font-weight: bold;">int</span> transferenciaMesual, <span style="color: #000066; font-weight: bold;">int</span> cantidadCorreo<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;">paquete</span>.<span style="color: #006633;">setNombre</span><span style="color: #009900;">&#40;</span>nombre<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">paquete</span>.<span style="color: #006633;">setPrecioAnual</span><span style="color: #009900;">&#40;</span>precio<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">paquete</span>.<span style="color: #006633;">setCapacidadDeAlmacenamiento</span><span style="color: #009900;">&#40;</span>cantidadAlmacenamiento<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">paquete</span>.<span style="color: #006633;">setTransferenciaMensual</span><span style="color: #009900;">&#40;</span>transferenciaMesual<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">paquete</span>.<span style="color: #006633;">setCantidadDireccionesCorreo</span><span style="color: #009900;">&#40;</span>cantidadCorreo<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> PaqueteDeHostingBuilder catidadSitiosPermitidos <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> cantidad<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;">paquete</span>.<span style="color: #006633;">setCantidadSitiosPermitidos</span><span style="color: #009900;">&#40;</span>cantidad<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHostingBuilder cantidadBaseDeDatos <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> cantidad<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;">paquete</span>.<span style="color: #006633;">setCantidadBaseDeDatos</span><span style="color: #009900;">&#40;</span>cantidad<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHostingBuilder accessoSsh<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">boolean</span> acceso<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;">paquete</span>.<span style="color: #006633;">setAccesoSsh</span><span style="color: #009900;">&#40;</span>acceso<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHostingBuilder panelControl <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">boolean</span> panel<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;">paquete</span>.<span style="color: #006633;">setPanelDeControl</span><span style="color: #009900;">&#40;</span>panel<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHostingBuilder codigoOferta<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> codigo<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;">paquete</span>.<span style="color: #006633;">setCodigoOferta</span><span style="color: #009900;">&#40;</span>codigo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> PaqueteDeHostingBuilder ipPublica <span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> ip<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;">paquete</span>.<span style="color: #006633;">setIpPublica</span><span style="color: #009900;">&#40;</span>ip<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Si lo analizamos el builder simplemente envuelve al objeto que creará, con una especie de métodos de acceso (parecido a un JavaBean) pero con la peculiaridad que se devuelve a sí mismo siempre. ¿En qué nos ayuda esto? Miremos el cliente como crea un Paquete ahora:</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;">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;
        PaqueteDeHosting personal <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> PaqueteDeHostingBuilder<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;personal&quot;</span>,<span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BigDecimal</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span>,<span style="color: #cc66cc;">10</span>,<span style="color: #cc66cc;">100</span>,<span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">build</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        PaqueteDeHosting bronce <span style="color: #339933;">=</span>
        <span style="color: #000000; font-weight: bold;">new</span> PaqueteDeHostingBuilder<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;bronce&quot;</span>,<span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BigDecimal</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">200</span><span style="color: #009900;">&#41;</span>,<span style="color: #cc66cc;">100</span>,<span style="color: #cc66cc;">1000</span>,<span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">accessoSsh</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">build</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        PaqueteDeHosting plata <span style="color: #339933;">=</span>
        <span style="color: #000000; font-weight: bold;">new</span> PaqueteDeHostingBuilder<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;plata&quot;</span>,<span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BigDecimal</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">300</span><span style="color: #009900;">&#41;</span>,<span style="color: #cc66cc;">100</span>,<span style="color: #cc66cc;">1000</span>,<span style="color: #cc66cc;">50</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">accessoSsh</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">catidadSitiosPermitidos</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">cantidadBaseDeDatos</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">build</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        PaqueteDeHosting oro <span style="color: #339933;">=</span>
        <span style="color: #000000; font-weight: bold;">new</span> PaqueteDeHostingBuilder<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;oro&quot;</span>,<span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BigDecimal</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">500</span><span style="color: #009900;">&#41;</span>,<span style="color: #cc66cc;">100</span>,<span style="color: #cc66cc;">4000</span>,<span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">accessoSsh</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">catidadSitiosPermitidos</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">cantidadBaseDeDatos</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">ipPublica</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;10.10.10.10&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">build</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Como vemos esto es mucho más sencillo de leer (aparte que la línea se alarga un poco, podríamos hacer varias líneas), y deja al objeto siempre en un estado consistente. Este método de construcción por medio de llamadas encadenadas se llama interfaces fluídas, y es el punto de inicio para muchos lenguajes como Groovy, que crean construcciones bastantes complejas a partir de Builders sencillos que permiten muchas configuraciones.</p>
<p>De nuevo, este no es el Builder de GoF, que veremos en otra ocasión, pero es otro concepto de Builder. Tiene la ventaja que es fácil de entender y de implementar. Imagino que ya se les ocurrió varias maneras de implementarlo en su código actual, así que manos a la obra y a dejar bonito el código! Finalmente les dejo el <a href="http://software.guisho.com/wp-content/uploads/2009/05/builderpattern-fluidinterfaces.zip">código fuente de los ejemplos aquí.</a></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/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>
<li><a href='http://software.guisho.com/abstract-factory-pattern-patrones' rel='bookmark' title='Permanent Link: Abstract Factory Pattern &#8211; Patrones'>Abstract Factory Pattern &#8211; Patrones</a></li>
<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>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://software.guisho.com/builder-pattern-interfaces-fluidas-patrones-de-diseno/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

