Builder Pattern em ColdFusion

On 14 de outubro de 2014, in CFML, Design Pattern, by andersonstraube

Builder é um padrão de projeto de software que permite a separação da construção de um objeto complexo da sua representação, de forma que o mesmo processo de construção possa criar diferentes representações.
Fonte: http://pt.wikipedia.org/wiki/Builder

Quando usar o Padrão Builder:


– Quando o algoritmo de criação de um objeto deve ser independente das suas partes constituintes e da maneira como ele é “criado”;
– Para que o processo de construção permita diferentes representações para o objeto que está sendo construído;
– Na simplificação de um objeto complexo, separando a sua “construção” da sua “constituição”.

Propósito:

– Separar a construção de um objeto de sua respectiva representação, e desta maneira, a partir dessa mesma construção, produzir representações diferentes [Gamma, et al, 1994].
– Mover a lógica de construção de uma classe para um objeto externo, a fim de reduzir a complexidade da mesma e permitir a construção gradual de objetos-alvo a partir dessa classe [Metsker, 2004].

Partindo dessa premissa vamos exemplificar o uso do Builder com um algoritmo de fast-food onde há alguns tipos diferentes de refeições para crianças (aquelas caixinhas com lanche e brinquedo junto). Por exemplo, podemos ter uma caixinha cujo conteúdo possua um carro de brinquedo, um sanduíche especial em formado de carro, batata frita e bebida. Outros tipos pode ser uma caixa com nuggets, salada, refrigerante e uma boneca, outra opção diferenciada com um hambúrguer, batata frita, refrigerante e brinquedo de robô.

Com isso temos então quatro funções básicas e comuns as 3 opções de lanche:

– Item/lanche principal;
– Item/lanche secundário;
– Bebida; e
– Brinquedo.

Vamos criar nossa caixinha unindo todos esses elementos dentro dela:

Caixa.cfc


<cfcomponent displayname="Caixa" output="false">

	<cffunction name="init" access="public" returntype="Caixa">
		<cfreturn this />
	</cffunction>


	<cffunction name="embalarRefeicao" access="public" returntype="void">
		<cfargument name="refeicao" type="IRefeicao" hint="Objeto Builder (tipo de refeicao)">

		<cfset var builder = arguments.refeicao />
		<cfset builder.adicionarItemPrincipal() />
		<cfset builder.adicionarItemSecundario() />
		<cfset builder.adicionarBebida() />
		<cfset builder.adicionarBrinquedo() />

	</cffunction>

</cfcomponent>

IRefeicao.cfc
Vamos criar a interface dos tipos de lanches:


<cfinterface displayName="IRefeicao">

	<cffunction name="adicionarItemPrincipal" access="public" returntype="void">
	</cffunction>

	<cffunction name="adicionarItemSecundario" access="public" returntype="void">
	</cffunction>

	<cffunction name="adicionarBebida" access="public" returntype="void">
	</cffunction>

	<cffunction name="adicionarBrinquedo" access="public" returntype="void">
	</cffunction>

</cfinterface>

CarroBuilder.cfc
Classe que contém o tipo de lanche cujo brinquedo é um carro:


<cfcomponent displayname="CarroBuilder" implements="IRefeicao" output="false">


	<cffunction name="init" access="public" returntype="CarroBuilder">
		<cfreturn this />
	</cffunction>


	<cffunction name="adicionarItemPrincipal" access="public" returntype="void">
		<cfoutput>Item principal adicionado!<br></cfoutput>
	</cffunction>


	<cffunction name="adicionarItemSecundario" access="public" returntype="void">
		<cfoutput>Item secundário adicionado!<br></cfoutput>
	</cffunction>


	<cffunction name="adicionarBebida" access="public" returntype="void">
		<cfoutput>Bebida adicionado!<br></cfoutput>
	</cffunction>


	<cffunction name="adicionarBrinquedo" access="public" returntype="void">
		<cfoutput>Brinquedo adicionado!<br></cfoutput>
	</cffunction>

</cfcomponent>

BonecaBuilder.cfc


<cfcomponent displayname="BonecaBuilder" implements="IRefeicao" output="false">


	<cffunction name="init" access="public" returntype="BonecaBuilder">
		<cfreturn this />
	</cffunction>


	<cffunction name="adicionarItemPrincipal" access="public" returntype="void">
		<cfoutput>Item principal adicionado!<br></cfoutput>
	</cffunction>


	<cffunction name="adicionarItemSecundario" access="public" returntype="void">
		<cfoutput>Item secundário adicionado!<br></cfoutput>
	</cffunction>


	<cffunction name="adicionarBebida" access="public" returntype="void">
		<cfoutput>Bebida adicionado!<br></cfoutput>
	</cffunction>


	<cffunction name="adicionarBrinquedo" access="public" returntype="void">
		<cfoutput>Brinquedo adicionado!<br></cfoutput>
	</cffunction>


</cfcomponent>

RoboBuilder.cfc


<cfcomponent displayname="RoboBuilder" implements="IRefeicao" output="false">


	<cffunction name="init" access="public" returntype="RoboBuilder">
		<cfreturn this />
	</cffunction>


	<cffunction name="adicionarItemPrincipal" access="public" returntype="void">
		<cfoutput>Item principal adicionado!<br></cfoutput>
	</cffunction>


	<cffunction name="adicionarItemSecundario" access="public" returntype="void">
		<cfoutput>Item secundário adicionado!<br></cfoutput>
	</cffunction>


	<cffunction name="adicionarBebida" access="public" returntype="void">
		<cfoutput>Bebida adicionado!<br></cfoutput>
	</cffunction>


	<cffunction name="adicionarBrinquedo" access="public" returntype="void">
		<cfoutput>Brinquedo adicionado!<br></cfoutput>
	</cffunction>

</cfcomponent>

teste.cfm
Vamos testar o Builder:


<cfscript>
	caixa  = CreateObject("component","Caixa").init();
	carro  = CreateObject("component","CarroBuilder").init();
	boneca = CreateObject("component","BonecaBuilder").init();
	robo   = CreateObject("component","RoboBuilder").init();

	caixa.embalarRefeicao( carro );
	caixa.embalarRefeicao( boneca );
	caixa.embalarRefeicao( robo );
</cfscript>

Até a próxima, abraço.

Fontes de pesquisa:
– http://www.pg.cefetpr.br/coinf/simone/patterns/builder.php e
– http://pt.wikipedia.org/wiki/Builder

Tagged with:  

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *