<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6287013328888778420</id><updated>2024-09-05T18:12:41.723-06:00</updated><category term="Domain Model"/><category term="Table Module"/><category term="Transaction Script"/><category term="Capa de negocio"/><category term="Active Record"/><category term="Capa de presentación"/><category term="DAO"/><category term="Data Access Object"/><category term="Desarrollando en Capas"/><category term="EJB"/><category term="Factory Method"/><category term="ORM"/><category term="Object Relation Mapping"/><category term="Objeto Mapeo Relación"/><category term="Patrón Singleton"/><category term="TransferObject"/><category term="capa de acceso a datos"/><category term="capa de dominio"/><title type='text'>El Rincón del Programadorcito</title><subtitle type='html'>Dicen que la mejor forma de aprender es enseñando... y si logro enseñar a base de tutoriales, artículos y demás, estaré mas que feliz.&#xa;&#xa;Bienvenidos!!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rinconprogramadorcito.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6287013328888778420/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://rinconprogramadorcito.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Alverik</name><uri>http://www.blogger.com/profile/02264184972877068627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHikXYQk4HUUFMNLlirhH-i9fB3JgaFlOBalU7z8NdVrPzHQAFnFqA1736Ia0C3BaO6K3rp8fYCf6ol8CZN0st-jYRYVok1ci8q9UpXa8WGkyN-YRFZ_xJ_v9AGgrmD4o/s220/Foto0180.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6287013328888778420.post-2256525506918514141</id><published>2010-11-19T12:25:00.002-06:00</published><updated>2010-11-19T12:43:07.586-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Domain Model"/><category scheme="http://www.blogger.com/atom/ns#" term="Table Module"/><category scheme="http://www.blogger.com/atom/ns#" term="Transaction Script"/><title type='text'>Capa de Negocio (Parte 2):  Domain Model</title><content type='html'>Continuando con los patrones de la capa de negocio llega el turno de Domain Model&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-large;&quot;&gt;Patrón Domain Model&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Al contrario que el patrón Transaction Script, la idea ahora es poder soportar lógica de negocio muy compleja por medio de Clases (si ahora solo puede ser POO).&lt;br /&gt;
&lt;br /&gt;
El patrón Domain Model, nos dice que ahora habrá que modelar el negocio y bajarlo a nivel de entidades, que en algún momento se traducirán a clases.&lt;br /&gt;
&lt;br /&gt;
En muchas ocasiones se confunde el Modelo de Dominio con el Modelo Entidad - Relación (Diagrama de la base de datos), cuando lo cierto es que estos dos modelos son muy diferentes, ya que el modelo de dominio no solo maneja datos, si no también procesos y algunos expertos dicen que tampoco debe permitir herencia.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Por ejemplo: Imaginemos que queremos modelar el proceso de apertura de una cuenta bancaria. Para abrir una cuenta bancaria se necesita un cliente, una operación de apertura(un deposito) y crear obviamente una nueva cuenta.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/_fLEjFeKaPPY/TLTcuFbAr2I/AAAAAAAAAEg/_iVKgzA8vkE/s1600/E-R.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;231&quot; src=&quot;http://4.bp.blogspot.com/_fLEjFeKaPPY/TLTcuFbAr2I/AAAAAAAAAEg/_iVKgzA8vkE/s400/E-R.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Seguramente un E-R para este tipo de procesos será mas complejo, pero para fines explicativos, creo que será suficiente.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
Ahora vamos a ver como se vería un Modelo de Dominio&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/_fLEjFeKaPPY/TLTctEHeiMI/AAAAAAAAAEc/YOY_Ke3WKXM/s1600/Domain+Model+-+diagrama+de+clases.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;103&quot; src=&quot;http://2.bp.blogspot.com/_fLEjFeKaPPY/TLTctEHeiMI/AAAAAAAAAEc/YOY_Ke3WKXM/s400/Domain+Model+-+diagrama+de+clases.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Ah!!, ya no son tan iguales cierto, y es que el modelo de dominio tiende a encapsular de alguna manera comportamiento, que puede afectar a mas de una tabla, como es el caso de la entidad &quot;CuentaBancaria&quot;.&lt;br /&gt;
&lt;br /&gt;
Tan solo el método crearCuenta de alguna manera invoca peticiones hacia las tablas CUENTA_BANCARIA, TIPO_CUENTA, OPERACION_BANCARIA y TIPO_OPERACION&lt;br /&gt;
&lt;br /&gt;
Y porque no crear una clase llamada &quot;OperacionBancaria&quot;, la respuesta es muy simple, no se me ocurre algún método particular para esta clase, es decir, operacionBancaria es una buena tabla para poder almacenar todas las transacciones que hacemos con la cuenta, cargos o abonos y al final podemos sacar un buen estado de cuenta de esta tabla, pero no tiene comportamiento propio, y es que el problema de tener Clases que no tengan comportamiento propio nos hace caer en un Antipatrón llamado &quot;Anemic Domain Model&quot;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;¿Qué es el Antipatrón &quot; Anemic Domain Model&quot; (Modelo de Dominio Flaco)?&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Como su nombre indica un Antipatrón es algo como el Némesis de un patrón, un enemigo natural, pero como todo enemigo natural siempre hay algo que comparten, algo que los hace acérrimos rivales puede ser la fuerza, velocidad o algo. En este caso en particular es que ambos son Clases.&lt;br /&gt;
&lt;br /&gt;
Incurrimos en este antipatrón cuando tenemos Clases sin comportamiento y que solo tienen Atributos o viceversa. Dado que los objetos de alguna manera tratan de modelar nuestra realidad no hay objetos que no tengan una funcionalidad especifica, o que no tengan características, no podría imaginar algún objeto que no sirva para nada o que no tenga ninguna característica.&lt;br /&gt;
&lt;br /&gt;
Por esta razón se les denominan anémicos, porque les hace falta comer algo para estar en forma, le hace falta tener o bien métodos o bien atributos.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;¿Como se cuales son las entidades de negocio?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
La verdad no es tan complicado, solo hay que responder algunas preguntas:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;¿Qué es?&amp;nbsp;&lt;/li&gt;
&lt;li&gt;¿Para qué sirve?&amp;nbsp;&lt;/li&gt;
&lt;li&gt;¿Cómo funciona?&amp;nbsp;&lt;/li&gt;
&lt;li&gt;¿Qué características tiene?&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;Si aplicamos esto al ejemplo anterior, podemos observar los siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt; &lt;br /&gt;
&lt;b&gt; Entidad: Cuenta Bancaria.&amp;nbsp;&lt;/b&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;b&gt;¿Que es?&lt;/b&gt; Es un concepto de banco que esta asociado a un Cliente, una Cuenta Bancaria es el eje principal para hacer operaciones y es la relación entre el Banco y el Cliente.&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;b&gt;¿Para que sirve&lt;/b&gt;? Es una especie de caja fuerte, en la cual un cliente puede guardar dinero electrónico, y disponer de el mediante algún mecanismo igualmente electrónico.&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;b&gt;¿Como funciona?&lt;/b&gt; Inicialmente debe ser creada con un deposito (agregar dinero a la caja), puede incrementar el saldo por medio depósitos en ventanilla o alguna transferencia electrónica a favor de la cuenta a lo cual se le denomina &quot;abono&quot; a la cuenta, para disponer del contenido se puede hacer mediante un pago electrónico o disposición de efectivo, a lo cual se le denomina &quot;Cargo&quot;.&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&lt;b&gt;¿Que características tiene?&lt;/b&gt; Cada cuenta es de un tipo especifico (Nómina, Ahorro, etc.), esta ligada a un solo Cliente pero un cliente puede tener muchas, tiene una fecha de apertura siempre debe contar con una cantidad de dinero disponible y los movimientos bancarios que ha tenido. &lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Cuando la entidad que se desea validar responde todas las preguntas fácilmente, es muy claro que es una verdadera entidad. Ahora vamos a intentar validar el concepto Operación Bancaria.&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt; &lt;br /&gt;
&lt;b&gt; Entidad: Operación Bancaria&lt;/b&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;b&gt;¿Que es?&lt;/b&gt; Es una transacción que involucra una cuenta y un movimiento ya sea de cargo o abono hacia la misma.&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;b&gt;¿Para que sirve?&lt;/b&gt; Para marcar un movimiento de una Cuenta Bancaria.&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;b&gt;¿Como funciona?&lt;/b&gt; Cuando una Cuenta Bancaria hace un movimiento de entra o salida de dinero esto genera una operación bancaria, la cual es de un tipo(Cargo o Abono).&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;b&gt;¿Que características tiene?&lt;/b&gt; Fecha de la operación, Tipo de movimiento e Importe.&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&amp;nbsp;&lt;i&gt;&quot;Oye, pero si contestó todas las preguntas&quot;&lt;/i&gt;, es cierto pero analicemos las respuestas:&lt;br /&gt;
&lt;br /&gt;
Es muy claro que tiene características y muy importantes por cierto, pero el funcionamiento, esta 100% ligado a un resultado de otra entidad &quot;Cuenta Bancaria&quot;, lo que quiere decir que no tiene comportamiento propio y en todas sus respuestas siempre menciona &quot;Cuenta Bancaria&quot;, lo que quiere decir que es una parte o consecuencia de una Cuenta Bancaria.&lt;br /&gt;
&lt;br /&gt;
No digo que se tenga que hacer esto a todas las entidades de negocio, pero es una buena forma de salir de dudas, sobre todo con aquellas entidades de las que no estamos tan seguros.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Pros y contras&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a lo interesante&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;b&gt;Pros:&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Nos permite modelar de una forma mas adecuada como funciona un negocio.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Aplicar cambios en el negocio es muy sencillo.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;No hay replicación de código.&lt;/li&gt;
&lt;li&gt;Las refactorizaciones se resumen a una clase especifica y no a todo el sistema.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Si el negocio crece, es mas sencillo modelarlo y cambiar el código.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Las pruebas se reducen a probar el funcionamiento de cada clase y como se comporta.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;&amp;nbsp;&lt;b&gt;Contras:&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Los errores no detectados en el modelo de dominio pueden repercutir seriamente en un futuro.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;El proceso de desarrollo depende de la especificación del modelo, por lo tanto tiende a ser mas lento.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Para validar el modelo, en ocasiones hacen falta varias revisiones, lo cual también toma cierto tiempo.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Conclusión&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;Si tienes un negocio muy complejo y/o cambiante y el tiempo no es un asunto de mucha relevancia (en el mundo del desarrollo eso es una epifanía), esta es una muy buena alternativa para solucionar el problema.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En el siguiente y ultimo articulo correspondiente a la Capa de Negocio veremos que es el &lt;a href =&quot;http://rinconprogramadorcito.blogspot.com/2010/11/capa-de-negocio-parte-3-table-module.html&quot;&gt;Table Module&lt;/a&gt; y pueden revisar el patron anterior &lt;a href=&quot;http://rinconprogramadorcito.blogspot.com/2010/10/capa-de-negocio-transaction-script.html&quot;&gt;Transaction Script&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rinconprogramadorcito.blogspot.com/feeds/2256525506918514141/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://rinconprogramadorcito.blogspot.com/2010/11/capa-de-negocio-parte-2-domain-model.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6287013328888778420/posts/default/2256525506918514141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6287013328888778420/posts/default/2256525506918514141'/><link rel='alternate' type='text/html' href='http://rinconprogramadorcito.blogspot.com/2010/11/capa-de-negocio-parte-2-domain-model.html' title='Capa de Negocio (Parte 2):  Domain Model'/><author><name>Alverik</name><uri>http://www.blogger.com/profile/02264184972877068627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHikXYQk4HUUFMNLlirhH-i9fB3JgaFlOBalU7z8NdVrPzHQAFnFqA1736Ia0C3BaO6K3rp8fYCf6ol8CZN0st-jYRYVok1ci8q9UpXa8WGkyN-YRFZ_xJ_v9AGgrmD4o/s220/Foto0180.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_fLEjFeKaPPY/TLTcuFbAr2I/AAAAAAAAAEg/_iVKgzA8vkE/s72-c/E-R.png" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6287013328888778420.post-7669756069851744014</id><published>2010-11-19T12:22:00.004-06:00</published><updated>2010-11-19T12:42:56.749-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Domain Model"/><category scheme="http://www.blogger.com/atom/ns#" term="Table Module"/><category scheme="http://www.blogger.com/atom/ns#" term="Transaction Script"/><title type='text'>Capa de Negocio (Parte 3): Table Module</title><content type='html'>&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-large;&quot;&gt;Patrón Table Module&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Es último patrón y no por eso el menos importante.&lt;br /&gt;
&lt;br /&gt;
Este patrón tiene su base en el modelo E-R de una base de datos, ya que ahora las clases contendías en la capa de negocio son una representación de las tablas de la base de datos.&lt;br /&gt;
&lt;br /&gt;
Es decir que ahora habrá una Clase que se encargará de administrar todo el comportamiento y lo datos que una tabla en particular.&lt;br /&gt;
&lt;br /&gt;
La diferencia principal entre el Domain Model y el Table Module es que, mientras que con el patrón Domain Model manejas un objeto por cada Cuenta Bancaria (retomando el ejemplo anterior) con Table Module, tendrás un solo objeto para manejar todas las Cuentas Bancarias y ahora si tendrás una clase llamada &quot;OperacionBancaria&quot;.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Este Patrón hace uso de la fortaleza que tienen las bases de datos relacionales, como los índices de las tablas mediante los cuales podemos obtener información particular de una forma mas rápida.&lt;br /&gt;
&lt;br /&gt;
Retomemos el ejemplo de la base de datos anterior.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/_fLEjFeKaPPY/TLTcuFbAr2I/AAAAAAAAAEg/_iVKgzA8vkE/s1600/E-R.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;231&quot; src=&quot;http://4.bp.blogspot.com/_fLEjFeKaPPY/TLTcuFbAr2I/AAAAAAAAAEg/_iVKgzA8vkE/s400/E-R.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Así un diagrama de clases para este patrón, luciría muy semejante, por no decir igual.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/_fLEjFeKaPPY/TLTcuRDzDUI/AAAAAAAAAEk/Cs06bo22EJs/s1600/Table+Module+-+Diagrama+de+Clases.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;253&quot; src=&quot;http://4.bp.blogspot.com/_fLEjFeKaPPY/TLTcuRDzDUI/AAAAAAAAAEk/Cs06bo22EJs/s320/Table+Module+-+Diagrama+de+Clases.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Las llaves primarias de una tabla es un índice natural de la tabla, por tanto podemos explotarlo y preguntar por una cuenta Bancaria por un &quot;Id&quot; especifico, lo cual nos sugeriría tener un método para dicho fin, algo semejante a lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;&lt;code&gt;cuentaBancaria.getCuentaBancariaById(long idCuentaBancaria)&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
El patrón puede aplicarse por medio de una instancia de clase o bien una serie de métodos estáticos, y eso es gracias a que la clase original no guarda comportamiento especifico para cada una de las cuentas bancarias por el contrario, debe mantenerse lo mas neutral posible.&lt;br /&gt;
&lt;br /&gt;
Cada clase podría incluir una fábrica de sentencias SQL o delegar esto a la capa de datos por medio de un patrón Table Data Gateway (prometo que pronto habrá un articulo hablando de este patrón), lo cual simplificaría aún mas las cosas y permitiría manejar de una forma mas natural las operaciones sobre la tabla en cuestión.&lt;br /&gt;
&lt;br /&gt;
Algunas veces llego a pensar que este patrón es una mezcla entre el Domain Model y el Transacction Script, si utilizamos un patrón Command, ya que ahora cada clase podría definirse como una clase de dominio y un proceso esta conformado a menudo por varias clases para conformar una transacción, si le aplicábamos un patrón Commnad, el manejo transaccional es relativamente sencillo.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;Pros y Contras&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Al igual que los patrones anteriores tiene algunas cosas buenas y otras que no lo son tanto.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Pros:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Dado que esta basado en la estructura de un E-R, hace que la propia tabla este estrechamente ligada a la capa de negocio lo cual hace que las operaciones con la tabla sean fácilmente programables y comprobables.&lt;/li&gt;
&lt;li&gt;Cada Clase aísla las operaciones sobre una tabla, por tal motivo si la base de datos tiende a cambiar, es muy fácil soportar este cambio.&lt;/li&gt;
&lt;li&gt;Cuando un cambio en la base de datos surge por la necesidad de mostrar algún dato extra en la vista, los cambios en el diseño de la aplicación son prácticamente nulos.&lt;/li&gt;
&lt;li&gt;El desarrollo es sumamente sencillo, y el tiempo también baja considerablemente al tener perfectamente definida la estructura E-R del la base de datos.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Contras:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Al igual que Transaction Script, este patrón funciona muy bien con una lógica de negocio sencilla, si la lógica es compleja, se comenzará a genera una maraña de dependencias entre las Clases de negocio.&lt;/li&gt;
&lt;li&gt;Dado que cada Clase tiene comunicación estricta con una tabla, si un proceso tiene que actuar sobre muchas tablas, podría verse reflejado esto en una baja de performance de la aplicación, aunque algunos tips sobre la capa de datos podrían ayudar (en el siguiente articulo veremos algunos).&lt;/li&gt;
&lt;li&gt;Aplicar polimorfismo es algo complejo, ya que a final de cuentas se esta haciendo un mapeo de cada tabla, y las bases de datos relacionales carecen de habilidad polimórfica.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;En conclusión&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
El patrón Table Model también facilita mucho el proceso de desarrollo y aunque puede cargar una lógica de negocio ciertamente compleja, entre mas compleja se vuelva esta, estaremos las cerca de comenzar a generar un código &quot;espagueti&quot;, es decir, una maraña de dependencias y llamadas entre clases.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;Pongamos todo sobre la mesa&lt;/span&gt;&lt;/b&gt; (&lt;a href = &quot;http://rinconprogramadorcito.blogspot.com/2010/10/capa-de-negocio-transaction-script.html&quot;&gt;Transaction Script&lt;/a&gt;, &lt;a href = &quot;http://rinconprogramadorcito.blogspot.com/2010/11/capa-de-negocio-parte-2-domain-model.html&quot;&gt;Domain Model&lt;/a&gt; y Table Module)&lt;br /&gt;
&lt;br /&gt;
Los 3 patrones de diseño son buenos bajo ciertas circunstancias y no son necesariamente excluyentes, incluso hay casos de éxito donde se han combinado un par de patrones, aunque si es necesario manejar una documentación apropiada para saber donde se aplico un patrón y donde el otro, yo personalmente he aplicado 2 patrones simultáneamente y me ha funcionado.&lt;br /&gt;
&lt;br /&gt;
El patrón Transaction Script lo utilizo principalmente para procesos sin gran trascendencia, como la alimentación de catálogos, o registro de información que posteriormente será procesada.&lt;br /&gt;
&lt;br /&gt;
El patrón Domain Model lo utilizo para las operaciones rudas del negocio, para las reglas que tienen muchas validaciones o que pueden ser muy cambiantes y complejas.&lt;br /&gt;
&lt;br /&gt;
El patrón Table Model, lo utilizo generalmente para sistemas con una complejidad que yo llamaría moderada y aplicando el patrón Command es posible tener procesos ciertamente poderosos y complejos sin perder mucho el hilo de que se hace en que parte.&lt;br /&gt;
&lt;br /&gt;
Al final la elección de un patrón sobre de otro se resume mucho a la complejidad del proyecto y el tiempo que tenemos para desarrollarlo, aunque reitero que es posible hacer una combinación de un par de ellos y tener un buen resultado.&lt;br /&gt;
&lt;br /&gt;
Próximamente tocaremos la capa de acceso a datos y la capa de vista, pero por el momento se termino la inspiración.&lt;br /&gt;
&lt;br /&gt;
Un Saludo.</content><link rel='replies' type='application/atom+xml' href='http://rinconprogramadorcito.blogspot.com/feeds/7669756069851744014/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://rinconprogramadorcito.blogspot.com/2010/11/capa-de-negocio-parte-3-table-module.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6287013328888778420/posts/default/7669756069851744014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6287013328888778420/posts/default/7669756069851744014'/><link rel='alternate' type='text/html' href='http://rinconprogramadorcito.blogspot.com/2010/11/capa-de-negocio-parte-3-table-module.html' title='Capa de Negocio (Parte 3): Table Module'/><author><name>Alverik</name><uri>http://www.blogger.com/profile/02264184972877068627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHikXYQk4HUUFMNLlirhH-i9fB3JgaFlOBalU7z8NdVrPzHQAFnFqA1736Ia0C3BaO6K3rp8fYCf6ol8CZN0st-jYRYVok1ci8q9UpXa8WGkyN-YRFZ_xJ_v9AGgrmD4o/s220/Foto0180.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_fLEjFeKaPPY/TLTcuFbAr2I/AAAAAAAAAEg/_iVKgzA8vkE/s72-c/E-R.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6287013328888778420.post-3817139352348894652</id><published>2010-11-19T11:19:00.003-06:00</published><updated>2010-11-19T17:39:13.823-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Active Record"/><category scheme="http://www.blogger.com/atom/ns#" term="Object Relation Mapping"/><category scheme="http://www.blogger.com/atom/ns#" term="Objeto Mapeo Relación"/><category scheme="http://www.blogger.com/atom/ns#" term="ORM"/><title type='text'>ORM (Object Relation Mapping) Parte 1</title><content type='html'>&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;¿Que es ORM?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Al surgir la programación orientada a objetos, todo pareció ser alegría hasta el momento de tener que enfrentarse con un dilema, &quot;Bases de datos&quot;&lt;br /&gt;
&lt;br /&gt;
Cuando la POO comenzó a tener un gran empuje, las personas comenzaron a preguntarse porque no tener&amp;nbsp;también&amp;nbsp;una Base de Datos Orientada a Objetos (BDOO), así que algunos&amp;nbsp;comenzaron&amp;nbsp;a investigar al respecto, pero... cual fue el problema.&lt;br /&gt;
&lt;br /&gt;
Las Bases de Datos Relacionales dominaban el mercado, había compañías&amp;nbsp;muy sólidas respaldaban sus productos, el lenjuage SQL ya era un&amp;nbsp;estándar&amp;nbsp;que todos&amp;nbsp;conocían y&amp;nbsp;las BDOO apenas estaban en plena concepción, dado que lo mas importante para las compañías es su información (Datos), no iban a apostar por una nueva herramienta en pleno desarrollo y dejar a un lado las ya maduras Bases de Datos Relacionales. Así que el paradigma de las BDOO se fue rezagando hasta quedar&amp;nbsp;prácticamente&amp;nbsp;en el olvido actualmente.&lt;br /&gt;
&lt;br /&gt;
En el mundo de caramelo de la POO, trabajar con una BDOO sería exelente por no decir magnifico, ya que la explotación de los datos sería mediante Objetos, es decir, se lanzaría una petición a la BD y esta en lugar de regresar un conjunto de datos como lo hace una BDR, regresaria un conjunto de objetos, representando una Entidad muy particular, así todo se manejaría a nivel de Objetos y no de datos.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Tristemente eso no paso así, lo cual&amp;nbsp;presento un nuevo problema para la POO ya que no podía interactuar naturalmente con una base de datos relacional, al menos no a nivel de Objetos.&lt;br /&gt;
&lt;br /&gt;
Así que para solventar este problema se creo el concepto de ORM ( algo así como &quot;Objeto&amp;nbsp;Relación&amp;nbsp;Mapeo&quot; en español). La idea es simple&amp;nbsp;obtener un conjunto de datos de una base de datos relacional y convertirla en Objetos por algún mecanismo.&lt;br /&gt;
&lt;br /&gt;
Para ello se&amp;nbsp;idearon&amp;nbsp;algunos patrones y en la&amp;nbsp;actualidad&amp;nbsp;existen varios frameworks para los distintos lenguajes OO que nos facilitan mucho la chamba.&lt;br /&gt;
&lt;br /&gt;
Sin embargo,&amp;nbsp;considero&amp;nbsp;que primero hay que entender los patrones en los que se basaron estos frameworks, para tener una perspectiva mas amplia a la hora de elegir uno u otro y no solo hacer caso de la popularidad.&lt;br /&gt;
&lt;br /&gt;
Así que sin mas preámbulo aquí vamos:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Nota:&lt;/b&gt; En los fragmentos de código, se hace uso de la clase ConnectionDao creada en el artículo &lt;a href=&quot;http://rinconprogramadorcito.blogspot.com/2010/10/patron-singleton.html&quot;&gt; Patrón Singleton &lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;Active Record&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Este patrón fue creado con la intención de solventar la deficiencia del Domain Model con las bases de datos relacionales y parece hacer lo que sería mas lógico, es decir,&amp;nbsp;ofrece&amp;nbsp;un mecanismo para que cada objeto de la capa de dominio modele únicamente y exclusivamente un registro de una tabla en particular y que el objeto tenga métodos para poder modificar dicho registro.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_fLEjFeKaPPY/TOanyY0e8qI/AAAAAAAAAHY/cLeMCK0Tdno/s1600/Clases.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/_fLEjFeKaPPY/TOanyY0e8qI/AAAAAAAAAHY/cLeMCK0Tdno/s1600/Clases.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Así cada uno de los objetos Alumno, estaría representando un registro de la tabla ALUMNO y el Cliente trabajaría con cada uno de estos objetos de forma transparente.&lt;br /&gt;
&lt;br /&gt;
Para obtener un mejor resultado podríamos utilizar métodos estáticos para poder obtener cada uno de los objetos Alumno, de esta manera los objetos son un tanto mas transparentes a la hora de obtener información de la base de datos&lt;br /&gt;
&lt;br /&gt;
Veamos el siguiente diagrama de secuencia&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/_fLEjFeKaPPY/TOanydQ3VJI/AAAAAAAAAHc/_A5gAkiX9ek/s1600/Secuencia.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/_fLEjFeKaPPY/TOanydQ3VJI/AAAAAAAAAHc/_A5gAkiX9ek/s1600/Secuencia.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div align=&quot;JUSTIFY&quot; lang=&quot;es-MX&quot; style=&quot;margin-bottom: 0cm;&quot;&gt;Por medio del método estático buscarAlumno, se obtiene un objeto de tipo Alumno, con la información cargada de un alumno en particular y se podrían hacer operaciones con este alumno, como modificar o borrar. De esta misma manera al crear un nuevo objeto alumno estaríamos tratando por debajo con un solo registro&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Un Ejemplo&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Vamos a pone un pequeño ejemplo de como se vería el código hecho en java para este patrón.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;TABLA Alumno&lt;/div&gt;&lt;table border=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: left; width: 630px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;CREATE TABLE ALUMNO (&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ID INT ID PRIMARY KEY,&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;NOMBRE VARCHAR(50),&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;EDAD INT&lt;br /&gt;
&amp;nbsp; );&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Ahora a crear el clase que modelará dicha tabla&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Alumno.java&lt;/div&gt;&lt;table border=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: left; width: 630px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;public class&amp;nbsp;&lt;/span&gt;Alumno {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;private&amp;nbsp;&lt;/span&gt;int&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;id&lt;/span&gt;&lt;/b&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;private&amp;nbsp;&lt;/span&gt;String&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;nombre&lt;/span&gt;&lt;/b&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;private&lt;/span&gt;&amp;nbsp;&lt;/span&gt;int&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;edad&lt;/span&gt;&lt;/b&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #999999;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //set&#39;s y get&#39;s&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: black;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;}&lt;/code&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;code&gt;&lt;br /&gt;
&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Agregamos los métodos estáticos por los cuales obtendremos los datos&lt;/div&gt;&lt;table border=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: left; width: 630px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp; public class&lt;/span&gt;&amp;nbsp;Alumno {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background-color: white; color: #cccccc;&quot;&gt;// Propiedades&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;private final static&lt;/span&gt;&amp;nbsp;String&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;FIND_BY_ID&lt;/span&gt;&lt;/b&gt;=&lt;span style=&quot;background-color: white; color: #b45f06;&quot;&gt;&quot;select * from alumno where id=?&quot;&lt;span style=&quot;color: black;&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;public static&lt;/span&gt;&amp;nbsp;Alumno&amp;nbsp;&lt;b&gt;buscarPorId&lt;/b&gt;(&lt;span style=&quot;background-color: white; color: blue;&quot;&gt;int&amp;nbsp;&lt;/span&gt;id)&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;throws&amp;nbsp;&lt;/span&gt;SQLException{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ConnectionDao cn = ConnectionDao.getInstance();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PreparedStatement prepared = cn.getPreparedStatement(&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;FIND_BY_ID&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; prepared.setInt(1,&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;id&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;return&amp;nbsp;&lt;/span&gt;&lt;i&gt;loadData&lt;/i&gt;(prepared.executeQuery());&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;private static&lt;/span&gt;&amp;nbsp;Alumno&amp;nbsp;&lt;b&gt;loadData&lt;/b&gt;(ResultSet rs)&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;throws&amp;nbsp;&lt;/span&gt;SQLException{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Alumno alumno = new Alumno();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alumno.&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;id&amp;nbsp;&lt;/span&gt;&lt;/b&gt;= rs.getInt(1);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alumno.&lt;b style=&quot;color: #38761d;&quot;&gt;nombre&amp;nbsp;&lt;/b&gt;= rs.getString(2);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alumno.&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;edad&amp;nbsp;&lt;/span&gt;&lt;/b&gt;= rs.getInt(3);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;return&amp;nbsp;&lt;/span&gt;alumno;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Al final solo faltaría agregar los métodos para poder modificar la información del registro que estamos modelando&lt;/div&gt;&lt;table border=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: left; width: 630px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;code&gt;&lt;span style=&quot;color: blue;&quot;&gt;public class&amp;nbsp;&lt;/span&gt;Alumno {&lt;/code&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;// Propiedades&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; ...&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;// Métodos estáticos&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; ...&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;private final static&lt;/span&gt;&amp;nbsp;String&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;UPDATE&amp;nbsp;&lt;/span&gt;&lt;/b&gt;=&amp;nbsp;&lt;span style=&quot;color: #b45f06;&quot;&gt;&quot;update alumno set nombre = ?, &quot;&lt;/span&gt;&amp;nbsp;+&lt;/code&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #b45f06;&quot;&gt;&quot;edad = ? where id = ?&quot;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;public void&lt;/span&gt;&amp;nbsp;&lt;b&gt;actualizar&lt;/b&gt;()&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;throws&amp;nbsp;&lt;/span&gt;SQLException{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ConnectionDao cn = ConnectionDao.getInstance();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; PreparedStatement prepared = cn.getPreparedStatement(&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;UPDATE&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; prepared.setString(1,&amp;nbsp;&lt;span style=&quot;color: #38761d;&quot;&gt;nombre&lt;/span&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; prepared.setInt(2,&amp;nbsp;&lt;b style=&quot;color: #38761d;&quot;&gt;edad&lt;/b&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; prepared.setInt(3,&amp;nbsp;&lt;b style=&quot;color: #38761d;&quot;&gt;id&lt;/b&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; prepared.executeUpdate();&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;private final static&lt;/span&gt;&amp;nbsp;String&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;INSERT&amp;nbsp;&lt;/span&gt;&lt;/b&gt;=&amp;nbsp;&lt;span style=&quot;color: #b45f06;&quot;&gt;&quot;insert into alumno values(?,?,?)&quot;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;public void&lt;/span&gt;&amp;nbsp;&lt;b&gt;insertar&lt;/b&gt;()&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;throws&amp;nbsp;&lt;/span&gt;SQLException{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ConnectionDao cn = ConnectionDao.getInstance();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; PreparedStatement prepared = cn.getPreparedStatement(&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;INSERT&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; prepared.setInt(1,&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;id&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; prepared.setString(2,&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;nombre&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; prepared.setInt(3,&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;edad&lt;/span&gt;&lt;/b&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; prepared.execute();&lt;br /&gt;
&amp;nbsp; }&lt;br /&gt;
}&lt;/code&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;code&gt;&lt;br /&gt;
&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;De tal forma que ahora la clase puede modificar, insertar o borrar exactamente 1 registro de la tabla Alumno&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Cuando alguna clase haga uso de este se vería así&lt;/div&gt;&lt;table border=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: left; width: 630px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;code&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;public class&lt;/span&gt;&amp;nbsp;Cliente {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;public void&amp;nbsp;&lt;/span&gt;modicarAlumno(&lt;span style=&quot;color: blue;&quot;&gt;int&amp;nbsp;&lt;/span&gt;id,String nombre,&lt;span style=&quot;color: blue;&quot;&gt;int&amp;nbsp;&lt;/span&gt;grupo){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;try&amp;nbsp;&lt;/span&gt;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Alumno alumno = Alumno.buscarPorId(id);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alumno.setNombre(nombre);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alumno.setEdad(id);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alumno.actualizar();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;catch&amp;nbsp;&lt;/span&gt;(Exception ex) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;public void&amp;nbsp;&lt;/span&gt;nuevoAlumno(&lt;span style=&quot;color: blue;&quot;&gt;int&amp;nbsp;&lt;/span&gt;id, String nombre,&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;int&amp;nbsp;&lt;/span&gt;grupo){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;try&amp;nbsp;&lt;/span&gt;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Alumno alumno = new Alumno();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alumno.setId(id);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alumno.setNombre(nombre);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alumno.setEdad(id);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alumno.insertar();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;catch&amp;nbsp;&lt;/span&gt;(SQLException ex) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;code&gt;&lt;/code&gt;&lt;/code&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Las operaciones que hacen los objetos alumno son muy transparentes&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;b&gt;Pros y Contras&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;b&gt;- Lo bueno&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Es un patón bastante simple de utilizar&lt;/li&gt;
&lt;li&gt;Resuelve de una manera muy simple la deficiencia de BDOO&lt;/li&gt;
&lt;li&gt;Es una forma muy elegante de encapsular el manejo de las BD&lt;/li&gt;
&lt;li&gt;Si el modelo de domino es muy similar a la estructura de la BD, el funcionamiento es muy transparente&lt;/li&gt;
&lt;li&gt;Si la estructura de una tabla cambia, el impacto solo es en la clase que modela dicha tabla&lt;/li&gt;
&lt;/ul&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;b&gt;- Lo malo&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Si las operaciones con la BD son complejas, tenderá a ser mas difícil de dar mantenimiento&lt;/li&gt;
&lt;li&gt;El patrón no impide generar 2 objetos del mismo registro, lo cual quiere decir que si se ejecutan una modificación en ambos, el segundo sobre escribirá al primero, generando un problema de concurrencia&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;b&gt;- La conclusión&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Es realmente simple integrar el patrón cuando la base de datos es prácticamente idéntica al diagrama de clases, pero si las diferencias entre ambos son grandes, es muy posible que te meta en mas problemas que de los que te saque, también se debe tomar en cuenta la concurrencia sobre los registros por generar dos objetos del mismo registro.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Hasta aquí llega la primera parte de los ORM.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Cualquier duda o comentario, no duden en hacermelo saber, ya que solo así aprenderemos los unos de los otros&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0.21cm; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Un Saludo&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rinconprogramadorcito.blogspot.com/feeds/3817139352348894652/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://rinconprogramadorcito.blogspot.com/2010/11/orm-object-relation-mapping-parte-1.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6287013328888778420/posts/default/3817139352348894652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6287013328888778420/posts/default/3817139352348894652'/><link rel='alternate' type='text/html' href='http://rinconprogramadorcito.blogspot.com/2010/11/orm-object-relation-mapping-parte-1.html' title='ORM (Object Relation Mapping) Parte 1'/><author><name>Alverik</name><uri>http://www.blogger.com/profile/02264184972877068627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHikXYQk4HUUFMNLlirhH-i9fB3JgaFlOBalU7z8NdVrPzHQAFnFqA1736Ia0C3BaO6K3rp8fYCf6ol8CZN0st-jYRYVok1ci8q9UpXa8WGkyN-YRFZ_xJ_v9AGgrmD4o/s220/Foto0180.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_fLEjFeKaPPY/TOanyY0e8qI/AAAAAAAAAHY/cLeMCK0Tdno/s72-c/Clases.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6287013328888778420.post-4933613930518450347</id><published>2010-11-05T13:54:00.002-06:00</published><updated>2010-11-05T13:58:49.684-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DAO"/><category scheme="http://www.blogger.com/atom/ns#" term="Data Access Object"/><category scheme="http://www.blogger.com/atom/ns#" term="Domain Model"/><category scheme="http://www.blogger.com/atom/ns#" term="EJB"/><category scheme="http://www.blogger.com/atom/ns#" term="Factory Method"/><category scheme="http://www.blogger.com/atom/ns#" term="TransferObject"/><title type='text'>Patrón DAO (Data Access Object)</title><content type='html'>Es un patrón canonizado por SUN, el cual se encuentra dentro de la definición de los &lt;a href=&quot;http://java.sun.com/blueprints/corej2eepatterns/Patterns/index.html&quot;&gt;J2EE Patterns&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Pero... para empezar a hablar sobre este patrón, primero deberemos entender que son los Tansfer Object (TO)&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;color: black;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;Transfer Object&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
El origen de este patrón surge por el uso de EJB; Los EJB son una instancia de clase remota a la cual se accede por mecanismos RMI. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;¿Que, qué es un EJB?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
En otro momento entraré en detalles mas técnicos, por ahora lo explicaré muy someramente.&lt;br /&gt;
&lt;br /&gt;
Basado en un patrón Domain Model, se identifican todas las entidades de negocio y se transforman a clases,  de las cuales se generan instancias. Las clases contienen cierta lógica del negocio o dominio, es decir, son como objetos especializados en resolver algún tema particular.&lt;br /&gt;
&lt;br /&gt;
Pero... ¿qué pasa si hay muchos sistemas que necesitan utilizar estas clases?. Es entonces cuando entran en escena los EJB. Lo que se le ocurrió a SUN, fue generar un contenedor de instancias de las entidades de negocio, una cajita donde siempre estuvieran disponibles los Objetos, lo cual también significa, que deberían estar aislados del resto de aplicaciones o por lo menos separados del resto.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/_fLEjFeKaPPY/TMhzY-PPTqI/AAAAAAAAAGE/DKUFI4EWYbA/s1600/EJB-INICIO.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/_fLEjFeKaPPY/TMhzY-PPTqI/AAAAAAAAAGE/DKUFI4EWYbA/s1600/EJB-INICIO.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;De esta manera, cualquiera podría utilizar la lógica de negocio que esta almacenada en los EJB (si has utilizado Servlets te sonará similar).&lt;br /&gt;
&lt;br /&gt;
¿Y cuál es el problema?...&lt;br /&gt;
Dado que los EJB existen dentro de la cajita, y que todo el mundo juega con ellos, nadie puede quedárselos por mucho tiempo, es decir ningún cliente debería tomar un EJB y regresarlo cuando termine de usarlo, porque que pasaría con los demás clientes, tendrían que esperar a que el EJB este libre y se encolarían las solicitudes como la fila de las tortillas.&lt;br /&gt;
&lt;br /&gt;
Y como los EJB están basados en un patrón Domain Model, deben tener comportamiento y propiedades de lo que están modelando, así, supongamos que tenemos  un EJB que modela la entidad Usuario, un cliente hace una petición hacia este para obtener los datos de un usuario en especifico, ¿qué pasaría?,&amp;nbsp; simple, se debería de cargar el EJB con los datos del usuario que se esta buscando. Pero... si el Objeto esta en el contenedor, para traerme sus atributos debería de hacer peticiones por cada atributo, algo similar a lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/_fLEjFeKaPPY/TMhzeOztXvI/AAAAAAAAAGc/7deXGeS3ZBE/s1600/MAL-EJB.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/_fLEjFeKaPPY/TMhzeOztXvI/AAAAAAAAAGc/7deXGeS3ZBE/s1600/MAL-EJB.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;El primer problema es que, se hace muchas peticiones por la red hacia el EJB y si el EJB tiene muchos atributos, bueno sería un calvario obtener cada uno de ellos y la red se estresaría mucho.&lt;br /&gt;
&lt;br /&gt;
El segundo problema es mas complejo, para esto veamos el siguiente diagrama.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/_fLEjFeKaPPY/TMhzZMNr0nI/AAAAAAAAAGI/oRPX158mX90/s1600/Concurrencia.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/_fLEjFeKaPPY/TMhzZMNr0nI/AAAAAAAAAGI/oRPX158mX90/s1600/Concurrencia.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;El cliente1 lanza una solicitud para obtener los datos de un usuario, el EJB se carga con esta inforación y el cliente1 comienza la tarea de sacar la información, pero si antes de que termine llega un cliente2 y lanza otra solicitud para obtener datos de otro usuario, cuando el cliente1 saque el siguiente dato ¿Los datos de quien estaría viendo? claro los de la segunda petición, esto es un problema de concurrencia.&lt;br /&gt;
&lt;br /&gt;
Y como solucionar este problema: CHAN, CHAN, CHAN, CHAAAANN, es cuando aparecen en escena los Transfer Object.&lt;br /&gt;
&lt;br /&gt;
La idea es guardar toda la información con la que debería de cargarse el EJB en un objeto independiente, un objeto que solo contenga los atributos de la entidad Usuario, y devolver este objeto al cliente, así dejaría en paz al EJB mas rápido, la red se estresaría menos y no habría el problema de concurrencia.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/_fLEjFeKaPPY/TMhzZoKlaJI/AAAAAAAAAGQ/wRi0l9w8IRg/s1600/EJB-Bonito.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/_fLEjFeKaPPY/TMhzZoKlaJI/AAAAAAAAAGQ/wRi0l9w8IRg/s1600/EJB-Bonito.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Así solo se hace un llamado al EJB, no se estresa la red y el EJB queda libre para seguir recibiendo peticiones.&lt;br /&gt;
&lt;br /&gt;
¿Entonces todo este rollo fue para decir que un Transfer Object, es un objeto que solo sirve como un mecanismo para transportar información de un punto a otro y que no tiene comportamiento?&lt;br /&gt;
&lt;br /&gt;
La respuesta es SI, solo es un objeto que sirve para transportar información al igual que si se hiciera mediante una estructura XML o JSON.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;De regreso al patrón DAO&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Ahora que ya sabemos que es un Transfer Object, podremos entender mejor lo que sigue.&lt;br /&gt;
&lt;br /&gt;
Dentro de las aplicaciones empresariales, el principal objetivo es almacenar información de alguna manera y en algún lugar, este lugar puede ser una base de datos relacional, una base de datos orientada a objetos archivos planos, o alguna otra forma que se les ocurra. &lt;br /&gt;
&lt;br /&gt;
Así que para cada mecanismo de almacenamiento, existen múltiples formas de acceder  a la fuente física de los datos y esto es algo que al negocio no le debería de importar, por tal motivo se debe de abstraer todo este conocimiento y envolverlo en una capa. &lt;br /&gt;
&lt;br /&gt;
El patrón DAO muestra una forma de envolver ese conocimiento y evitar que el negocio se manche las manos con esta ardua tarea, lo que significa que la explotación de los datos se hará mediante objetos DAO. La información que se obtiene de las fuentes de datos es convertida o encapsulada a un objeto de tipo TransferObject, o alguna colección de estos.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/_fLEjFeKaPPY/TMhzeDXyhvI/AAAAAAAAAGg/wKHr0N_faZM/s1600/PatronDAO.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/_fLEjFeKaPPY/TMhzeDXyhvI/AAAAAAAAAGg/wKHr0N_faZM/s1600/PatronDAO.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Así el negocio solo recibe por medio de objetos la información que necesita y no le interesa realemente que mecanismo se utilizó para obtener la información.&lt;br /&gt;
&lt;br /&gt;
En realidad el funcionamiento es muy similar a lo que sucede con los EJB, ya que el Transfer Object sigue siendo quien transporta la información hacia la capa que solicita la información.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Manejando múltiples DataSources: Patrón Factory Method&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Cuando por asares del destino nuestra aplicación debe hacer uso de muchas fuentes de datos, se traduce en tener varios mecanismos para obtener la informació y tendriamos un pequeño problema ¿Cómo administro todos los mecanismos?&lt;br /&gt;
&lt;br /&gt;
Imaginemos que tenemos que administrar 3 fuentes de datos, una en archivos TXT otra en XLS(Excel) y la última con una BD Relacional, y las 3 tienen una estructura de datos muy similar para resguardar los datos de un usuario.&lt;br /&gt;
&lt;br /&gt;
Si la capa de negocio no debe enterarse de como se estrae la información ¿qué hacer?&lt;br /&gt;
&lt;br /&gt;
El patron&amp;nbsp; Factory Method nos dice como poder solucionar este problema&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_fLEjFeKaPPY/TMhzZsCL8gI/AAAAAAAAAGU/k1zWiqguEpU/s1600/Factory+Method+-+Class.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/_fLEjFeKaPPY/TMhzZsCL8gI/AAAAAAAAAGU/k1zWiqguEpU/s1600/Factory+Method+-+Class.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;A la capa cliente no le interesa como leen y escriben los datos, el solo sabe que debe recibir un TO que modela un Usuario y tambien debe saber de donde quiere sacar la información. Así el cliente hace esta elección por medio del FactoryDao&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/_fLEjFeKaPPY/TMhzeEkqkTI/AAAAAAAAAGY/2w1RMkCdeTc/s1600/Factory+Method+-+secuencia.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/_fLEjFeKaPPY/TMhzeEkqkTI/AAAAAAAAAGY/2w1RMkCdeTc/s1600/Factory+Method+-+secuencia.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Si esto lo completamos con un Tranfer Object y un patrón Singleton, tenemos ahora algo mas robusto y flexible para manejar multiples fuentes de datos.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;A trabajar se a dicho&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Pongamos un poco de código para reforzar esto:&lt;br /&gt;
&lt;br /&gt;
Vamos a retomar el ejemplo de los diagramas, modelando una estructura de datos de Usuarios&lt;br /&gt;
&lt;br /&gt;
Clase Factrory:&lt;br /&gt;
&lt;table border=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: left; width: 630px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&lt;span style=&quot;color: blue;&quot;&gt;public abstract class&lt;/span&gt; &lt;b&gt;FactoryDao &lt;/b&gt;{&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public static final&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;int &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;TXT_&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;FACTORY &lt;/span&gt;&lt;/b&gt;= 1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public static final int&lt;/span&gt; &lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;MYSQL_FACTORY&lt;/span&gt;&lt;/b&gt; = 2;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public abstract&lt;/span&gt; UsuarioDao &lt;b&gt;getUsuarioDao&lt;/b&gt;();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public static&lt;/span&gt; FactoryDao &lt;b&gt;getFactory&lt;/b&gt;(&lt;span style=&quot;color: blue;&quot;&gt;int &lt;/span&gt;claveFactory){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;switch&lt;/span&gt;(claveFactory){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;case &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;TXT_FACTORY&lt;/span&gt;&lt;/b&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return new &lt;/span&gt;TxtFactoryDao();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;case &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;MYSQL_FACTORY&lt;/span&gt;&lt;/b&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return new &lt;/span&gt;MySqlFactoryDao();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;default&lt;/span&gt;:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;throw new &lt;/span&gt;IllegalArgumentException();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;br /&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
La clase factroy se encarga generar los objetos FactoryDao para cada una de las fuentes de datos, esto lo hace mediante el método estático &lt;code&gt;&lt;b&gt;getFactory&lt;/b&gt;(&lt;span style=&quot;color: blue;&quot;&gt;int)&lt;/span&gt;&lt;/code&gt; y obliga a quien lo implemente a sobreescribir el método &lt;code&gt;&lt;b&gt;getUsuarioDao&lt;/b&gt;&lt;/code&gt;&lt;code&gt;()&lt;/code&gt;. &lt;br /&gt;
&lt;br /&gt;
Interfaz UsuarioDao&lt;br /&gt;
&lt;table border=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: left; width: 630px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&lt;span style=&quot;color: blue;&quot;&gt;public interface&lt;/span&gt; &lt;b&gt;UsuarioDao &lt;/b&gt;{&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; UsuarioTO &lt;b&gt;buscarUsuario&lt;/b&gt;(String nombre);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;void &lt;/span&gt;&lt;b&gt;insertarUsuario&lt;/b&gt;(UsuarioTO usuario);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;void &lt;/span&gt;&lt;b&gt;modificarUsuario&lt;/b&gt;(UsuarioTO usuario);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Se define cuales son los métodos que tendrán todos los DAO&#39;s que quieran ser un UsuarioDao&lt;br /&gt;
&lt;br /&gt;
Clase MySQLFactoryDao&lt;br /&gt;
&lt;table border=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: left; width: 630px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&lt;span style=&quot;color: blue;&quot;&gt;public class&lt;/span&gt; &lt;b&gt;MySqlFactoryDao &lt;/b&gt;&lt;span style=&quot;color: blue;&quot;&gt;extends &lt;/span&gt;&lt;b&gt;FactoryDao &lt;/b&gt;{&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; UsuarioDao &lt;b&gt;getUsuarioDao&lt;/b&gt;() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return new&lt;/span&gt; &lt;b&gt;UsuarioMySqlFactoryDao&lt;/b&gt;();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Extiende la clase FactoryDao e implementa el metodo getUsuarioDao, generando un objeto que consuma el data source que necesita, en esta caso una base de datos MySQL&lt;br /&gt;
&lt;br /&gt;
Clase TxtFactoryDao&lt;br /&gt;
&lt;table border=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: left; width: 630px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&lt;span style=&quot;color: blue;&quot;&gt;public class&lt;/span&gt; &lt;b&gt;TxtFactoryDao &lt;/b&gt;&lt;span style=&quot;color: blue;&quot;&gt;extends &lt;/span&gt;&lt;b&gt;FactoryDao&lt;/b&gt;{&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public &lt;/span&gt;UsuarioDao &lt;b&gt;getUsuarioDao&lt;/b&gt;() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return new &lt;/span&gt;UsuarioTXTFactoryDao();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;br /&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Ocurre lo mismo que la clase MySQLFactoryDao salvo que ahora se genera un objeto de UsuarioTXTFactoryDao()&lt;br /&gt;
&lt;br /&gt;
Clase UsuarioMySQLFactoryDao&lt;br /&gt;
&lt;table border=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: left; width: 630px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&lt;span style=&quot;color: blue;&quot;&gt;public class&lt;/span&gt; &lt;b&gt;UsuarioMySqlFactoryDao &lt;/b&gt;&lt;span style=&quot;color: blue;&quot;&gt;implements &lt;/span&gt;&lt;b&gt;UsuarioDao &lt;/b&gt;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;private &lt;/span&gt;ConnectionDao cn;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public &lt;/span&gt;&lt;b&gt;UsuarioMySqlFactoryDao&lt;/b&gt;() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cn = ConnectionDao.getInstance();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public &lt;/span&gt;UsuarioTO &lt;b&gt;buscarUsuario&lt;/b&gt;(String nombre) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;throw new &lt;/span&gt;UnsupportedOperationException(&lt;span style=&quot;color: #e69138;&quot;&gt;&quot;Not supported yet.&quot;&lt;/span&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public void&lt;/span&gt; &lt;b&gt;insertarUsuario&lt;/b&gt;(UsuarioTO usuario) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;throw new &lt;/span&gt;UnsupportedOperationException(&lt;span style=&quot;color: #e69138;&quot;&gt;&quot;Not supported yet.&quot;&lt;/span&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public void &lt;/span&gt;&lt;b&gt;modificarUsuario&lt;/b&gt;(UsuarioTO usuario) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;throw new &lt;/span&gt;UnsupportedOperationException(&lt;span style=&quot;color: #e69138;&quot;&gt;&quot;Not supported yet.&quot;&lt;/span&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Las operaciones que esta clase hace son dirigidas hacia una sola fuente de datos (Una Base de Datos en MySQL)&lt;br /&gt;
&lt;br /&gt;
Clase UsuarioTXTFactoryDao&lt;br /&gt;
&lt;table border=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: left; width: 630px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&lt;span style=&quot;color: blue;&quot;&gt;public class &lt;/span&gt;&lt;b&gt;UsuarioTXTFactoryDao &lt;/b&gt;&lt;span style=&quot;color: blue;&quot;&gt;implements &lt;/span&gt;&lt;b&gt;UsuarioDao &lt;/b&gt;{&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public &lt;/span&gt;UsuarioTXTFactoryDao() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public &lt;/span&gt;UsuarioTO &lt;b&gt;buscarUsuario&lt;/b&gt;(String nombre) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;throw new &lt;/span&gt;UnsupportedOperationException(&lt;span style=&quot;color: #b45f06;&quot;&gt;&quot;Not supported yet.&quot;&lt;/span&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public void &lt;/span&gt;insertarUsuario(UsuarioTO usuario) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;throw new &lt;/span&gt;UnsupportedOperationException(&lt;span style=&quot;color: #b45f06;&quot;&gt;&quot;Not supported yet.&quot;&lt;/span&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public void &lt;/span&gt;modificarUsuario(UsuarioTO usuario) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;throw new &lt;/span&gt;UnsupportedOperationException(&lt;span style=&quot;color: #b45f06;&quot;&gt;&quot;Not supported yet.&quot;&lt;/span&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
} &lt;br /&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
Ahora las operaciones son sobre un archivo de texto&lt;br /&gt;
&lt;br /&gt;
Clase UsuarioTO&lt;br /&gt;
&lt;table border=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: left; width: 630px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&lt;span style=&quot;color: blue;&quot;&gt;public class&lt;/span&gt; UsuarioTO {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;private &lt;/span&gt;String nombre;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;private &lt;/span&gt;String apellido;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;private int&lt;/span&gt; edad;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: #cccccc;&quot;&gt;//Métodos set y get&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;}&lt;br /&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Es la clase mediante la cual se transformarán los datos de las diferentes fuentes de datos&lt;br /&gt;
&lt;br /&gt;
Clase Cliente &lt;br /&gt;
&lt;table border=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: left; width: 630px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&lt;span style=&quot;color: blue;&quot;&gt;public class&lt;/span&gt; Cliente {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;private &lt;/span&gt;FactoryDao &lt;b style=&quot;color: #38761d;&quot;&gt;txtFactory &lt;/b&gt;=&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;FactoryDao.getFactory(FactoryDao.&lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;TXT_FACTORY&lt;/span&gt;&lt;/b&gt;);&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;private &lt;/span&gt;UsuarioDao &lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;usuarioDao &lt;/span&gt;&lt;/b&gt;= &lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;txtFactory&lt;/span&gt;&lt;/b&gt;.getUsuarioDao();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public &lt;/span&gt;UsuarioTO &lt;b&gt;buscarUsuario&lt;/b&gt;(String nombre){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return &lt;/span&gt;&lt;b style=&quot;color: #38761d;&quot;&gt;usuarioDao&lt;/b&gt;.buscarUsuario(nombre);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public void &lt;/span&gt;&lt;b&gt;insertarUsuario&lt;/b&gt;(String nombre, String apellido, &lt;span style=&quot;color: blue;&quot;&gt;int &lt;/span&gt;edad){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UsuarioTO usuario = &lt;span style=&quot;color: blue;&quot;&gt;new &lt;/span&gt;UsuarioTO();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; usuario.setNombre(nombre);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; usuario.setApellido(apellido);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; usuario.setEdad(edad);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;usuarioDao&lt;/span&gt;&lt;/b&gt;.insertarUsuario(usuario);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Ahora la clase Cliente decide que fuente de datos usar por medio del método getFactory(), de el cual se puede obtener un objeto que implemente la interfaz UsuarioDao. El resto de las operaciones sobre UsuarioDao son muy transparentes para la clase cliente, ya que no se entera de como hace su proceso para extraer y guardar información&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Así concluye este articulo sobre el Patrón DAO y como extender las fuentes de datos con el patrón Factory Method &lt;br /&gt;
&lt;br /&gt;
Los invito a dejar sus comentarios, dudas y por su puesto sugerencias, estamos en este proceso de mejorar así que cualquier aportación siempre es bien recibida&lt;br /&gt;
&lt;br /&gt;
Un Saludo</content><link rel='replies' type='application/atom+xml' href='http://rinconprogramadorcito.blogspot.com/feeds/4933613930518450347/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://rinconprogramadorcito.blogspot.com/2010/11/patron-dao-data-access-object.html#comment-form' title='20 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6287013328888778420/posts/default/4933613930518450347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6287013328888778420/posts/default/4933613930518450347'/><link rel='alternate' type='text/html' href='http://rinconprogramadorcito.blogspot.com/2010/11/patron-dao-data-access-object.html' title='Patrón DAO (Data Access Object)'/><author><name>Alverik</name><uri>http://www.blogger.com/profile/02264184972877068627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHikXYQk4HUUFMNLlirhH-i9fB3JgaFlOBalU7z8NdVrPzHQAFnFqA1736Ia0C3BaO6K3rp8fYCf6ol8CZN0st-jYRYVok1ci8q9UpXa8WGkyN-YRFZ_xJ_v9AGgrmD4o/s220/Foto0180.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_fLEjFeKaPPY/TMhzY-PPTqI/AAAAAAAAAGE/DKUFI4EWYbA/s72-c/EJB-INICIO.png" height="72" width="72"/><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6287013328888778420.post-3335807927039923430</id><published>2010-10-27T19:52:00.002-05:00</published><updated>2010-11-19T12:39:51.908-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Patrón Singleton"/><title type='text'>Patrón Singleton</title><content type='html'>Cuando escribí el artículo &lt;a href=&quot;http://rinconprogramadorcito.blogspot.com/2010/10/desarrollando-en-capas.html&quot;&gt;Desarrollo en capas&lt;/a&gt;, un amigo me comento que de alguna manera debería de explicar que es el patrón Singleton. &lt;br /&gt;
&lt;br /&gt;
Bien su suplica se ha hecho realidad y para ejemplificar utilizaré Java &lt;br /&gt;
&lt;br /&gt;
En realidad este patrón es muy simple. La idea básica de este patrón es que solo pueda existir una instancia de una clase en la aplicación. &lt;br /&gt;
&lt;br /&gt;
El primer paso para conseguir este patrón es bloquear la forma de generar instancias de la clase, esto se hace simplemente privatizando el constructor de la clase&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;table border=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: left; width: 600px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public class&lt;/span&gt; &lt;b&gt;Singleton&lt;/b&gt;{&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;    private &lt;/span&gt;Singleton(){}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; }&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;El punto principal de este patrón esta en los miembros de clase o miembros estáticos, ya que estos se crean mediante el ClassLoader, algo similar a las variables globales en la programación estructurada, lo cual quiere decir que su consentido es persistente por todo el ciclo de vida de la aplicación. &lt;br /&gt;
&lt;br /&gt;
Así que utilizando la potencia de los miembros estáticos crearemos una instancia estática de la clase para que viva durante toda la vida de la aplicación.&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: left; width: 600px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;public class&lt;/span&gt; &lt;b&gt;Singleton &lt;/b&gt;{ &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;private static&lt;/span&gt; Singleton &lt;b&gt;&lt;span style=&quot;color: #6aa84f;&quot;&gt;singleton &lt;/span&gt;&lt;/b&gt;= &lt;span style=&quot;color: blue;&quot;&gt;new &lt;/span&gt;Singleton();&lt;/code&gt;&lt;br /&gt;
&lt;code&gt; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;private&lt;/span&gt; &lt;b&gt;Singleton&lt;/b&gt;(){} &lt;br /&gt;
&lt;br /&gt;
}&lt;/code&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;
Ahora solo falta tener alguna forma de acceder a este objeto, y esto es mediante un método estático&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: left; width: 600px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;public class&lt;/span&gt; &lt;b&gt;Singleton &lt;/b&gt;{ &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;private static&lt;/span&gt; Singleton &lt;b&gt;&lt;span style=&quot;color: #6aa84f;&quot;&gt;singleton&lt;/span&gt;&lt;/b&gt;&lt;/code&gt;&lt;code&gt;&lt;b&gt;&lt;span style=&quot;color: #6aa84f;&quot;&gt; &lt;/span&gt;&lt;/b&gt;= &lt;span style=&quot;color: blue;&quot;&gt;new &lt;/span&gt;Singleton()&lt;/code&gt;&lt;code&gt;; &lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;private &lt;/span&gt;&lt;b&gt;Singleton&lt;/b&gt;(){} &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public static&lt;/span&gt; Singleton &lt;b&gt;getInstance&lt;/b&gt;(){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; Singleton.&lt;/code&gt;&lt;b&gt;&lt;code style=&quot;color: #6aa84f;&quot;&gt;singleton&lt;/code&gt;&lt;code style=&quot;color: #6aa84f;&quot;&gt;&lt;/code&gt;&lt;/b&gt;&lt;code&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;
} &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Cuando utilizar el patrón Singleton &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
La forma mas utilizada para aplicar este patrón, es para la capa de acceso a datos. Generalmente por cada operación que necesitemos hacer con la base de datos, creamos una nueva conexión, nos autentificamos y en seguida mandamos las sentencias SQL que necesitemos ejecutar. &lt;br /&gt;
&lt;br /&gt;
Si aplicamos un patrón Singleton a la conexión a la base de datos y mantenemos la conexión abierta, nos evitaremos abrir y cerrar la conexión por cada petición &lt;br /&gt;
&lt;br /&gt;
A continuación pongo un pequeño ejemplo de la aplicación de este patrón &lt;br /&gt;
&lt;br /&gt;
Clase ConnectionDao&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: left; width: 600px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;public class&lt;/span&gt; &lt;b&gt;ConnectionDao &lt;/b&gt;{ &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&lt;span style=&quot;color: blue;&quot;&gt;private static&lt;/span&gt; &lt;/code&gt;&lt;code&gt;ConnectionDao connectionDao; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&lt;span style=&quot;color: blue;&quot;&gt;private &lt;/span&gt;&lt;/code&gt;&lt;code&gt;Connection &lt;b&gt;&lt;span style=&quot;color: #6aa84f;&quot;&gt;connection&lt;/span&gt;&lt;/b&gt;; &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;span style=&quot;color: blue;&quot;&gt;private &lt;/span&gt;&lt;/code&gt;&lt;b&gt;&lt;code&gt;&lt;/code&gt;&lt;/b&gt;&lt;code&gt;&lt;b&gt;ConnectionDao&lt;/b&gt;()&lt;span style=&quot;color: blue;&quot;&gt; throws &lt;/span&gt;ExceptionInInitializerError{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt; try &lt;/span&gt;{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  String classDriver = &lt;span style=&quot;color: #e69138;&quot;&gt;&quot;...&quot;&lt;/span&gt;; &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;String url = &lt;span style=&quot;color: #e69138;&quot;&gt;&quot;...&quot;&lt;/span&gt;; &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;Class.forName(classDriver).newInstance(); &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&lt;b&gt;&lt;span style=&quot;color: #6aa84f;&quot;&gt;connection &lt;/span&gt;&lt;/b&gt;= DriverManager.getConnection(url); &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;}&lt;span style=&quot;color: blue;&quot;&gt; catch &lt;/span&gt;(Exception ex) { &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&lt;span style=&quot;color: blue;&quot;&gt;throw new &lt;/span&gt;ExceptionInInitializerError(ex); &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;} &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;  } &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public &lt;/span&gt;ResultSet &lt;b&gt;executeQuery&lt;/b&gt;(String query) &lt;span style=&quot;color: blue;&quot;&gt;throws &lt;/span&gt;SQLException{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; Statement statement = connection.createStatement(); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt; return &lt;/span&gt;statement.executeQuery(query); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;  } &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt; public &lt;/span&gt;boolean &lt;b&gt;executeNonQuery&lt;/b&gt;(String query)&lt;span style=&quot;color: blue;&quot;&gt; throws &lt;/span&gt;SQLException{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  Statement statement = connection.createStatement(); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt; return &lt;/span&gt;statement.execute(query); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;  }&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; PreparedStatement &lt;b&gt;getPreparedStatement&lt;/b&gt;(String query)&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&lt;span style=&quot;color: blue;&quot;&gt;throws &lt;/span&gt;SQLException{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #6aa84f;&quot;&gt;connection&lt;/span&gt;&lt;/b&gt;.prepareStatement(query);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public static &lt;/span&gt;ConnectionDao &lt;b&gt;getInstance&lt;/b&gt;(){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt;(ConnectionDao.&lt;b&gt;&lt;span style=&quot;color: #6aa84f;&quot;&gt;connectionDao &lt;/span&gt;&lt;/b&gt;== &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;) &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  ConnectionDao.&lt;b&gt;&lt;span style=&quot;color: #6aa84f;&quot;&gt;connectionDao &lt;/span&gt;&lt;/b&gt;= &lt;span style=&quot;color: blue;&quot;&gt;new &lt;/span&gt;ConnectionDao(); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;return &lt;/span&gt;ConnectionDao.&lt;b&gt;&lt;span style=&quot;color: #6aa84f;&quot;&gt;connectionDao&lt;/span&gt;&lt;/b&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;}&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
El constructor se encarga de establecer la conexión a la base de datos, pero esta no se cierra para dejar el canal de comunicación siempre abierto. &lt;br /&gt;
&lt;br /&gt;
El método estático getInstance() es el encargado de crear la instancia de la clase ConnectionDao si esta no existe y de regresar una referencia a dicha instancia &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Clase UsuarioDao&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: left; width: 600px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;public class &lt;/span&gt;&lt;b&gt;UsuarioDao &lt;/b&gt;{ &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;public void &lt;/span&gt;&lt;b&gt;insertar&lt;/b&gt;(&lt;span style=&quot;color: blue;&quot;&gt;String&lt;/span&gt;... datos){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style=&quot;color: blue;&quot;&gt; try &lt;/span&gt;{ &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;String sql = &lt;span style=&quot;color: #e69138;&quot;&gt;&quot;insert ...&quot;&lt;/span&gt;; &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;ConnectionDao.getInstance().executeNonQuery(sql); &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;}&lt;span style=&quot;color: blue;&quot;&gt; catch &lt;/span&gt;(SQLException ex) { &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: black;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code style=&quot;color: black;&quot;&gt;...&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;} &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;} &lt;br /&gt;
&lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style=&quot;color: blue;&quot;&gt;public void &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;b&gt;buscar&lt;/b&gt;(String... datos){ &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span style=&quot;color: blue;&quot;&gt;try &lt;/span&gt;{ &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;String sql = &lt;span style=&quot;color: #e69138;&quot;&gt;&quot;select ...&quot;&lt;/span&gt;; &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;ConnectionDao connection = ConnectionDao.getInstance(); &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;connection.executeQuery(sql); &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;}&lt;span style=&quot;color: blue;&quot;&gt; catch &lt;/span&gt;(SQLException ex) {&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;  &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;...&lt;/code&gt;&lt;code&gt; &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;} &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&lt;span style=&quot;color: blue;&quot;&gt;public void &lt;b&gt;&lt;span style=&quot;color: black;&quot;&gt;actualizar&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/code&gt;&lt;code&gt;(String... datos){ &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&lt;span style=&quot;color: blue;&quot;&gt;try &lt;/span&gt;{ &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;String sql = &lt;span style=&quot;color: #e69138;&quot;&gt;&quot;update ...&quot;&lt;/span&gt;; &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;ConnectionDao connection = ConnectionDao.getInstance(); &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;PreparedStatement prepared =&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; connection.getPreparedStatement(sql); &lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; prepared.setString(1,datos)&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; prepared.executeUpdate();&lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;}&lt;span style=&quot;color: blue;&quot;&gt; catch &lt;/span&gt;(SQLException ex) {&amp;nbsp;&lt;/code&gt;&lt;code&gt;  &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;...&lt;/code&gt;&lt;code&gt; &lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;} &lt;br /&gt;
&lt;/code&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/code&gt;&lt;code&gt;}&lt;br /&gt;
} &lt;br /&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Así para obtener la referencia al objeto ConectionDao llamamos al método ConnectionDao.getInstance(); que nos dará acceso a los metodos &quot; executeQuery&quot;, &quot; executeNonQuery &quot; y &quot;&lt;code&gt;&lt;b&gt;getPreparedStatement&lt;/b&gt;&lt;/code&gt;&quot;&lt;br /&gt;
&lt;br /&gt;
De esta manera concluye este pequeño tutorial sobre el patrón Singleton, si tienen alguna duda o un comentario, no duden en dejarlo e intentaré atenderlo lo mas pronto posible &lt;br /&gt;
&lt;br /&gt;
Un Saludo&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rinconprogramadorcito.blogspot.com/feeds/3335807927039923430/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://rinconprogramadorcito.blogspot.com/2010/10/patron-singleton.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6287013328888778420/posts/default/3335807927039923430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6287013328888778420/posts/default/3335807927039923430'/><link rel='alternate' type='text/html' href='http://rinconprogramadorcito.blogspot.com/2010/10/patron-singleton.html' title='Patrón Singleton'/><author><name>Alverik</name><uri>http://www.blogger.com/profile/02264184972877068627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHikXYQk4HUUFMNLlirhH-i9fB3JgaFlOBalU7z8NdVrPzHQAFnFqA1736Ia0C3BaO6K3rp8fYCf6ol8CZN0st-jYRYVok1ci8q9UpXa8WGkyN-YRFZ_xJ_v9AGgrmD4o/s220/Foto0180.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6287013328888778420.post-3461345302156918396</id><published>2010-10-12T18:53:00.024-05:00</published><updated>2010-11-19T12:42:45.406-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Capa de negocio"/><category scheme="http://www.blogger.com/atom/ns#" term="Domain Model"/><category scheme="http://www.blogger.com/atom/ns#" term="Table Module"/><category scheme="http://www.blogger.com/atom/ns#" term="Transaction Script"/><title type='text'>Capa de Negocio (Parte 1): Transaction Script</title><content type='html'>&lt;i&gt;Edición:&amp;nbsp;Por sugerencia de varios amigos, he decidido separar este articulo por tema, al final se encuentran las ligas hacia los otros patrones&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Recuerdo perfectamente que entre las capas que más trabajo me costo entender como funcionaban y como utilizar fue la capa de negocio y es que termina siendo la ultima que descubres y la última que entiendes como usar y programar, por ello decidí dar un pequeño salto en el orden de las capas para adentrarnos en este pequeño mundito. No quiero decir que no habrá articulo sobre la capa de vista, ¡por su puesto que lo habrá!, solo quise explicar de una vez por todas, lo que mas trabajo me costo entender.&lt;br /&gt;
&lt;br /&gt;
La capa de negocio puede ser manejada de varias formas y en este contexto encontramos principalmente 3 contrincantes, el patrón Transaction Script, el patrón Domain Model y el patrón Table Module.&lt;br /&gt;
&lt;br /&gt;
La conclusión a la cual quiero llegar al final, no es decir cual es mejor o peor, ya que los 3 tienen sus pros y contras; la idea es dar un panorama y porque no, un par de consejos del ¿como? y el ¿cuando? utilizar uno u otro y que al final te sea mas simple tomar una decisión de que patrón(es) te conviene(n) usar mas.&lt;br /&gt;
&lt;br /&gt;
Ahora, vamos a echarle un ojo a los participantes para tener un lugar en la capa de negocio.&lt;br /&gt;
&lt;div&gt;&lt;div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;div style=&quot;text-align: -webkit-auto;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: x-large;&quot;&gt;Patrón Transaction Script&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;
La idea básica de este patrón se basa en las rutinas.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Hace algún tiempo cuando los sistemas no eran tan complejos, si queríamos que un sistema realizará una u otra operación, se programaba una rutina. Una rutina es un conjunto de pasos secuenciales, donde las tomas de decisión son muy raras, así se tenía un proceso muy concreto para realizar algo.&lt;br /&gt;
&lt;br /&gt;
El patrón TS es básicamente eso, una rutina; por ejemplo, pensemos que tenemos un sistema de ventas, donde por cada venta realizada, revisamos si necesitamos poner una orden para reabastecer nuestro inventario (si ya sé, es el ejemplo del post anterior, pero funcionará!)&lt;br /&gt;
&lt;br /&gt;
Veamos el siguiente diagrama:&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/_fLEjFeKaPPY/TLTdf953XjI/AAAAAAAAAEo/DzbX27TXdmY/s1600/Transaction+Script+-+diagrama+de+secuencia.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/_fLEjFeKaPPY/TLTdf953XjI/AAAAAAAAAEo/DzbX27TXdmY/s1600/Transaction+Script+-+diagrama+de+secuencia.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;El diagrama nos habla de una vista &quot;PantallaVenta&quot;, una clase de negocio &quot;PuntoDeVenta&quot; y 3 clases de Datos &quot;Inventario&quot;, &quot;Pedidos&quot; y &quot;Ventas&quot;.&lt;br /&gt;
&lt;br /&gt;
El foco de nuestra atención debe centrarse en la clase &quot;PuntoDeVenta&quot;, esta es un ejemplo del patrón Transaction Script, ya que basándose en el concepto inicial, la clase &quot;PuntoDeVenta&quot; es la que rige toda la operación de venta.&lt;br /&gt;
&lt;br /&gt;
Esto quiere decir, que si en algún momento cambia alguna regla de negocio con respecto a las ventas o si tenemos una incidencia con este modulo, sabremos donde apuntar con el dedo ¡aparte de al desarrollador claro!.&lt;br /&gt;
&lt;br /&gt;
Este patrón puede ser utilizado de forma más elegante, si lo ayudamos con el patrón Command&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;El patrón Command (tu me llamas, yo los llamo)&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
El patrón Command, funciona básicamente como una interfaz (programáticamente hablando), que muestra cierto comportamiento a la capa de vista, y de alguna manera, encapsula toda la funcionalidad de la capa de negocio.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;¿Qué dice que dijo?&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
La funcionalidad dentro de la clase &quot;PuntoDeVenta&quot; no esta en un solo método (por favor díganme que no), sino esta en varios métodos. A ojo de buen programador yo sacaría unos 5 métodos:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;ValidarUnidades&amp;nbsp;&lt;/li&gt;
&lt;li&gt;RegistrarVenta&amp;nbsp;&lt;/li&gt;
&lt;li&gt;SolicitarPedido&amp;nbsp;&lt;/li&gt;
&lt;li&gt;ActualizarInventario&amp;nbsp;&lt;/li&gt;
&lt;li&gt;CalcularCominsion&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;Cada uno de ellos tiene cierta funcionalidad, el patrón Command nos dice que todo esto se puede agrupar, de tal forma que se llame a todos de un solo jalón.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://1.bp.blogspot.com/_fLEjFeKaPPY/TLTcrO2DYCI/AAAAAAAAAEU/yxD2G2zo6Mg/s1600/Command+-llamda+a+metodo.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/_fLEjFeKaPPY/TLTcrO2DYCI/AAAAAAAAAEU/yxD2G2zo6Mg/s1600/Command+-llamda+a+metodo.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Expresado esto en un diagrama de clases, se vería como esto:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/_fLEjFeKaPPY/TLTcrfm_U4I/AAAAAAAAAEY/pC7oSv4LIIE/s1600/Commnad-diagrama+de+Clases.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/_fLEjFeKaPPY/TLTcrfm_U4I/AAAAAAAAAEY/pC7oSv4LIIE/s1600/Commnad-diagrama+de+Clases.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Es decir, la capa de presentación solo puede acceder a la lógica de negocio por medio de una interfaz, y una implementación, la implementación llama de forma ordenada los métodos definidos en la clase PuntoDeVenta, es una forma muy elegante de aislar la capa de presentación y la capa de negocio.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Pros y contras&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Sin duda es una forma muy fácil y rápida de programar, cuado tenemos una lógica de negocio no muy compleja, pero... que pasa cuando la complejidad aumenta. Sin duda llegará algún otro proceso de negocio que necesite registrar algún pedido, o calcular la comisión, pero dado que es parte de otro modulo tenderemos a replicar código. Esto se puede evitar si aislamos estos métodos por medio de herencia (Nada nos restringe a usarla), aún así para que nos demos cuenta de que métodos deben estar aislados, seguramente haremos una labor de refactorización, y si el negocio es muy cambiante, bueno, tenemos un verdadero problema entre manos.&lt;br /&gt;
&lt;br /&gt;
Recopilando estos datos, podemos obtener las siguientes concluciones sobre este patrón.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Pros:&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Fácil de desarrollar.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Si el negocio no cambia fácilmente, es fácil de mantener.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Al unirlo con el patrón Command, el manejo transaccional es muy sencillo.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Cada uno de los procesos es fácil de probar.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Contras:&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Si el negocio cambia constantemente, significa una gran cantidad de cambios en las clases.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Tiene una alta tendencia a replicar código.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Cuando se hacen las refactorizaciones, se pierde más tiempo que con otro modelo.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;El impacto en los cambios, sucede como un efecto de &quot;Domino&quot; por lo tanto, cuando se realiza un cambio en un módulo, los módulos alrededor necesitan ser probados, aún cuando estos no tienen dependencia directa.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;En conclusión&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Si el tiempo de desarrollo es muy limitado y el negocio no esta tan complejo y susceptible a cambios, es una muy buena opción implementar este patrón.&lt;br /&gt;
&lt;br /&gt;
Ahora continuaremos con los siguientes 2 concursantes&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://rinconprogramadorcito.blogspot.com/2010/11/capa-de-negocio-parte-2-domain-model.html&quot;&gt;Domain Model&lt;/a&gt; y &lt;a href=&quot;http://rinconprogramadorcito.blogspot.com/2010/11/capa-de-negocio-parte-3-table-module.html&quot;&gt;Table Module&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rinconprogramadorcito.blogspot.com/feeds/3461345302156918396/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://rinconprogramadorcito.blogspot.com/2010/10/capa-de-negocio-transaction-script.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6287013328888778420/posts/default/3461345302156918396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6287013328888778420/posts/default/3461345302156918396'/><link rel='alternate' type='text/html' href='http://rinconprogramadorcito.blogspot.com/2010/10/capa-de-negocio-transaction-script.html' title='Capa de Negocio (Parte 1): Transaction Script'/><author><name>Alverik</name><uri>http://www.blogger.com/profile/02264184972877068627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHikXYQk4HUUFMNLlirhH-i9fB3JgaFlOBalU7z8NdVrPzHQAFnFqA1736Ia0C3BaO6K3rp8fYCf6ol8CZN0st-jYRYVok1ci8q9UpXa8WGkyN-YRFZ_xJ_v9AGgrmD4o/s220/Foto0180.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_fLEjFeKaPPY/TLTdf953XjI/AAAAAAAAAEo/DzbX27TXdmY/s72-c/Transaction+Script+-+diagrama+de+secuencia.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6287013328888778420.post-5693296875933167487</id><published>2010-10-09T03:11:00.001-05:00</published><updated>2010-10-27T20:22:07.902-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="capa de acceso a datos"/><category scheme="http://www.blogger.com/atom/ns#" term="capa de dominio"/><category scheme="http://www.blogger.com/atom/ns#" term="Capa de negocio"/><category scheme="http://www.blogger.com/atom/ns#" term="Capa de presentación"/><category scheme="http://www.blogger.com/atom/ns#" term="Desarrollando en Capas"/><title type='text'>Desarrollando en Capas</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Hace algún tiempo llegue a trabajar a una empresa donde tenían ya algunos sistemas implementados, la empresa tenía la necesidad de añadir funcionalidad a dichos sistemas, comencé a revisarlos y me di cuenta de algo, no existía la capa de negocio (Domain o Business como la quieran llamar), me pregunte muchas veces el porque sin llegar a una respuesta, tenían 2 capas híbridas(porque no eran ni uno ni lo otro), una para la vista y&amp;nbsp; una para acceso a datos, pero, las reglas del negocio estaban mezcladas entre la vista y el acceso a datos, lo cual significa que una nueva regla de negocio o una modificación involucraba mover por todos lados sin tener la certeza que funcionara, así que pensé en escribir algo sobre el como, el porque, el cuando y el donde, yo usaría las 3 capas convencionales (Presentación, Negocio y Acceso a datos).&lt;/span&gt;&lt;/div&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Definitivamente una de las formas mas frecuentes que encontramos a la hora de desarrollar alguna aplicación, sistema o lo que sea que involucre código es la programación en capas (bueno hay sus excepciones).&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;La teoría básica de la programación en capas, es tener la posibilidad de separar partes que conforman un sistema. Pensemos en un pastel (el 3 leches es mi favorito)&amp;nbsp; que esta hecho de varias capas de varios sabores y que aparte esta cubierto de merengue o cualquier otro menjurje que se les ocurra. La primera capa es ocultada por la segunda, la segunda por la tercera y así hasta tener un pastel de n capas,  finalmente tendremos la cubierta que es la presentación al consumidor, aún cuando la presentación es la que atrae al comprador, si las demás capas tienen mal sabor seguramente el cliente no regresará por otro pastel.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;La idea de las capas es también que podamos poner sobre esta una o varias mas con la idea de poder crear cosas diferentes sobre la misma base, imaginen un pastel como el siguiente (repito imaginen):&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: center;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEip4bkcbbw-NumjskDBYyzoSjpOMEwnNHSlStsAfrahw0gDkQ1Yz2w2_5hO0QNgbPNd3Px1ZSrY-KAyA3CpvnGvjQXBu8ca8-UWr4qJij68M0gdZXARX8JsalYFIkXRoMsspDO_Ti-IaPIU/s1600/capas+de+pastel.png&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEip4bkcbbw-NumjskDBYyzoSjpOMEwnNHSlStsAfrahw0gDkQ1Yz2w2_5hO0QNgbPNd3Px1ZSrY-KAyA3CpvnGvjQXBu8ca8-UWr4qJij68M0gdZXARX8JsalYFIkXRoMsspDO_Ti-IaPIU/s1600/capas+de+pastel.png&quot; /&gt; &lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Si cortamos 3 rebanadas, una con fresa, otra con uva y otra con naranja, las tres sabrán a chocolate, pero la combinación con el sabor de la capa superior los hará diferentes (no necesariamente sabrá bien).&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Lo mismo ocurre en los sistemas, sobre de una capa es posible montar otras, que tengan funcionalidades diferentes, pero en su interior comparten algo (similar a la herencia).&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Así que una programación en capas proporciona muchos beneficios.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Desacoplar el sistema, tener ahora varias cabezas que atacan un problema.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Independizar el funcionamiento entre las capas.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Aislar la repercusión de un cambio en una capa a las demás.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Definir estándares para cada capa, de manera que cada una pueda tener sus propias reglas en su juego.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Que sobre una capa puedan montarse muchas otras aún cuando estas tengan diferentes objetivos.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Sin embargo no todo es miel sobre hojuelas, también tiene algunas desventajas.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - El caso mas típico es que unaUI necesite mostrar algún dato y que la capa de datos no lo tenga&amp;nbsp;&amp;nbsp; disponible, eso significa que se deberán modificar todas las capas desde el acceso a datos hasta al interfaz de usuario.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Entre mas capas se tengan mas lento se volverá el desempeño, generalmente cada capa tiende a hacer una &quot;traducción&quot; de lo que recibe para poder usarlo a su conveniencia, lo cual quiere decir que si existen 5 capas habrá 5 transformaciones, &quot;malo&quot;, el desempeño se vuelve lento.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Entendiendo el asunto de las capas&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;En mis primeros ejercicios de programación en la escuela tenia que modificar archivos,  y cosas así realmente era muy simple, no tenía la necesidad de separar mi código.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4v3o5evLJ8LhyyCUWOdItuumOuUpFETB-zWUQcmOF1P7JuvVVXU46K7g2Bgp5SlSGka_PKDRb1w6j0XFKxOfU4-tNBi4MMpWTtIx7MOtqj30mXhkqMhFFYHCnkBGClYBFmsrsyZVvdHkN/s1600/proceso+simple.png&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4v3o5evLJ8LhyyCUWOdItuumOuUpFETB-zWUQcmOF1P7JuvVVXU46K7g2Bgp5SlSGka_PKDRb1w6j0XFKxOfU4-tNBi4MMpWTtIx7MOtqj30mXhkqMhFFYHCnkBGClYBFmsrsyZVvdHkN/s1600/proceso+simple.png&quot; /&gt; &lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Mientras pasaba el tiempo comenzó a aumentar la complejidad de tal manera que ahora usábamos las Amadas y Odiadas Bases de Datos. Al principio siguiendo el mismo patrón era copiar cierta información de un archivo y pasarlo a la base de datos y viceversa. El problema llego cuando apareció un maestro que nos enseño a crear UIs, y después teníamos que crear un ABCC (Altas, Bajas, Cambios y Consultas), como todo buen estudiante, seguí el mismo patrón, una sola capa con todo el código, sin embargo después de crear un solo ABCC ahora tenia que crear varios, y tuve la necesidad reutilizar código especialmente la parte para establecer la conexión a la base de datos.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Fue así como tuve la necesidad de tener 2 capas (la verdad no las llamaba así), la capa para manejar la Interfaz del Usuario y la capa para acceder a los datos.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1Yr5ZYOZ_NfCFd-YB8RV9MXzjBqiAQcxA3bgq_EfwqunRkguguLzfYFGTNEfi0OOgiLzH9h_T-LvZeUMriLfTvJR4zQfez0wEz-qFid9POiYUVMA4MbkjZ0e9vpG5ucBK5o1i2ARKH4Lq/s1600/interfaz-datos.png&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1Yr5ZYOZ_NfCFd-YB8RV9MXzjBqiAQcxA3bgq_EfwqunRkguguLzfYFGTNEfi0OOgiLzH9h_T-LvZeUMriLfTvJR4zQfez0wEz-qFid9POiYUVMA4MbkjZ0e9vpG5ucBK5o1i2ARKH4Lq/s1600/interfaz-datos.png&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Hasta ahí todo era felicidad, sin embargo llego el momento de desarrollar sistemas mas complejos basados en especificaciones mas realistas lo que se llamaría como &quot;Lógica de Negocio&quot; o &quot;Modelo de Dominio&quot; o &quot;Lógica de Dominio&quot;, se llame como se llame esta parte hace referencia a reglas especificas de como funciona alguna situación en particular, por ejemplo:&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Cuando un estudiante va a reinscribirse, primero hay que ver si tiene derecho, revisando si aprobó el 50% de sus materias del curso pasado, y si tiene derecho a beca por haber obtenido un promedio &quot;X&quot; y además si hay cupo en las materias que selecciono.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Ahora no se trata solo de agregar un registro a la base de datos, se trata de que antes de eso hay que validar varias cosas .&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Para ser franco cuando esto paso, mi primer instinto fue poner todas esas reglas como parte de la presentación y todo sencillo, pero en algún momento llego el caso que para que un alumno solicitará un certificado de estudios, debería de validar que no debiera mas del 50% de sus materias del semestre pasado, AAHHH yo ya tenia el código para hacer esto, así que &quot;Copy/Paste&quot;, en una nueva interfaz, luego si un alumno solicitaba su numero de cuenta para pagar la inscripción se debería de revisar si tenia beca o no, SIII también tenia ese código hecho y nuevamente &quot;Copy/&lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Paste&lt;/span&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&quot;. En algún momento en la vida me di cuenta que tenia código repetido por todos lados, lo mismo que paso con las conexiones a la base de datos, así que pensé en aislar esa parte de código y tenerla como una &quot;librería de funciones&quot;, lo que estaba haciendo realmente era tener una nueva capa, la capa de &quot;Dominio&quot;, &quot;Negocio&quot; o &quot;Lógica de negocio&quot;, como sea que la llamen, de tal manera que accidentalmente descubrí que una aplicación podía ser dividida en capas (aún cuando yo no las llamara así).&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSIfnMB1FKhkU0jGylxDRJgmbW1xKTRjGtIgO8dazxXI_hh_BIJVaLWkaAqck3kXTICDg5_z-JxX4ateww8jMjVUhO1ESuOBnyr-1l3T_TSpCLHKR3FWlCckbpHTEbnSlq84avY2MkjHf4/s1600/interfaz-negocio-datos.png&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSIfnMB1FKhkU0jGylxDRJgmbW1xKTRjGtIgO8dazxXI_hh_BIJVaLWkaAqck3kXTICDg5_z-JxX4ateww8jMjVUhO1ESuOBnyr-1l3T_TSpCLHKR3FWlCckbpHTEbnSlq84avY2MkjHf4/s1600/interfaz-negocio-datos.png&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Después de un tiempo leyendo el libro de Patterns of Enterprice Application Architecture de Martin Fowler descubrí que lo que había hecho no estaba del todo descabellado y que era algo muy cotidiano en el mundo del desarrollo de sistemas, lo a lo cual di gracias por no estar tan loco.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Básicamente Fowler dice que esta es la forma principal de dividir un sistema en 3 capas básicas.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;table border=&quot;1&quot; style=&quot;font-family: Verdana,sans-serif; margin-left: 0px; margin-right: 0px; text-align: left;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt; &lt;td style=&quot;color: black; text-align: center;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Capa&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;td style=&quot;color: black; text-align: center;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Uso&lt;/b&gt;&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Presentación:&lt;/span&gt;&lt;/td&gt; &lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Dedicada a mostrar la información al usuario y recibir las entradas del mismo&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Dominio o Negocio:&lt;/span&gt;&lt;/td&gt; &lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Todo lo concerniente a las reglas del negocio como validaciones y tomas de decisión&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Acceso a datos o fuente de datos &lt;/span&gt;&lt;/td&gt; &lt;td&gt;&lt;span style=&quot;font-size: small;&quot;&gt;El mecanismo por el cual se accede a la fuente a donde esta la información (No necesariamente debe ser una base de datos, puede ser un txt un excel u otra cosa)&lt;/span&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Sin embargo no es una regla tallada en la piedra que tengamos estas capas o dicho mejor solo estas capas, es muy común que algunas de estas sean separadas en mas, dependiendo de los requerimientos y también el tipo de sistema que vayamos a desarrollar o las herramientas que vayamos a utilizar.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Fowler dice en su libro que hay ocasiones muy particulares cuando si es posible juntar la capa de presentación y la de dominio, específicamente cuando la complejidad de el dominio es muy baja o prácticamente nula, yo digo que no, que siempre hay que sepáralas, por una simple razón, el negocio tiene a cambiar y hacerse mas complejo, si todo esta en la presentación tendremos un problema a la larga.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Cada cosa en su lugar&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;También se preguntarán “Oye y que va en que parte”, bien pues resulta que todo lo que tenga que ver con acceso a datos deberíamos de ponerlo en la capa de datos, muchos la llamamos como DAO (Data Access Object), aquí deberíamos controlar desde abrir las conexiones, explotar la información o agregarla hasta cerrar las conexiones, salvo que implementes un patrón Singleton.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;La parte difícil comienza cuado tienes que decidir que va en la capa de presentación y que va en la capa de negocio. &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Lo que yo digo es que todas aquellas acciones que tienen que ver exclusivamente con la vista pues van en la vista, y aquellas que tienen algún matiz de ser parte de la operación de de cómo funciona algo en la empresa son parte del negocio.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Por ejemplo en la vista yo pondría validaciones sobre longitudes de campos, sobre si debe ir un campo alfanumérico y cosas por el estilo, porque estas no son parte del negocio, si se ingresa en un campo de texto un entero o una letra, no es algo que al negocio le importe.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Imaginemos que en una tienda debe aparecer una alerta en la interfaz cada vez que haga falta algún producto, si involucramos la palabra interfaz podría parecer que es parte la interfaz, cuando en realidad la interfaz esta llamado un procedimiento de negocio y tomando una decisión sobre el resultado, veamos esto en el siguiente diagrama de secuencia.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_14JseolFCiTfS-OmOj0P0LCcJwQSzwFXo51KxGJ96kQeKNTN1Y3loCTb8PAsK9KjjlW-Cyf5pCybzzCLv4dTQyrz3nOjq00f7FvU37xUrUDyr6rdq37-QvRwpCOkPtF83_xaVImk26FD/s1600/caso+de+uso.png&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_14JseolFCiTfS-OmOj0P0LCcJwQSzwFXo51KxGJ96kQeKNTN1Y3loCTb8PAsK9KjjlW-Cyf5pCybzzCLv4dTQyrz3nOjq00f7FvU37xUrUDyr6rdq37-QvRwpCOkPtF83_xaVImk26FD/s1600/caso+de+uso.png&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;En este pequeño diagrama podemos apreciar principalmente 3 cosas. &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.- Aún cuando la vista inicia el proceso, esta no tiene ninguna participación en el procedo de toma de decisiones, solo reacciona de acuerdo a la información que obtenga de la capa de negocio, lo cual quiere decir que el proceso de saber si existe o no inventario no le pertenece.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2.- La capa de negocio toma una decisión dependiendo del nivel del inventario, si este es menor a 5 coloca un pedido esto es una “Regla de negocio” y de esto no se entera ni la capa de vista ni la capa de datos, si en algún momento la tienda crece y tenemos la necesidad de tener mejor surtidos nuestros almacenes, incrementaremos la condición y eso no afecta absolutamente a nadie. &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3.- Ni a la capa de la presentación ni a la capa de negocio le interesa de donde sale la información, esto es una preocupación única y excesiva de la capa de Acceso a Datos, así si en algún momento deciden utilizar una base de datos, solo se deberá modificar la capa de acceso a datos y tampoco afecta absolutamente a nadie. &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;font-family: Verdana,sans-serif; text-align: justify;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Hasa aquí llega la parte básica del desarrollo en Capas, mas adelante veremos como algunas de estas capas pueden transformarse en otras y daremos paso a nuevos patrones de diseño.&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rinconprogramadorcito.blogspot.com/feeds/5693296875933167487/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://rinconprogramadorcito.blogspot.com/2010/10/desarrollando-en-capas.html#comment-form' title='9 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6287013328888778420/posts/default/5693296875933167487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6287013328888778420/posts/default/5693296875933167487'/><link rel='alternate' type='text/html' href='http://rinconprogramadorcito.blogspot.com/2010/10/desarrollando-en-capas.html' title='Desarrollando en Capas'/><author><name>Alverik</name><uri>http://www.blogger.com/profile/02264184972877068627</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHikXYQk4HUUFMNLlirhH-i9fB3JgaFlOBalU7z8NdVrPzHQAFnFqA1736Ia0C3BaO6K3rp8fYCf6ol8CZN0st-jYRYVok1ci8q9UpXa8WGkyN-YRFZ_xJ_v9AGgrmD4o/s220/Foto0180.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEip4bkcbbw-NumjskDBYyzoSjpOMEwnNHSlStsAfrahw0gDkQ1Yz2w2_5hO0QNgbPNd3Px1ZSrY-KAyA3CpvnGvjQXBu8ca8-UWr4qJij68M0gdZXARX8JsalYFIkXRoMsspDO_Ti-IaPIU/s72-c/capas+de+pastel.png" height="72" width="72"/><thr:total>9</thr:total></entry></feed>