{"id":21373314,"url":"https://github.com/duquejo/typescript-designpatterns","last_synced_at":"2025-03-16T09:13:24.088Z","repository":{"id":133693464,"uuid":"455355156","full_name":"duquejo/Typescript-DesignPatterns","owner":"duquejo","description":"Práctica general de patrones de diseño para casos prácticos.","archived":false,"fork":false,"pushed_at":"2022-02-04T20:56:12.000Z","size":97,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-22T21:16:02.797Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/duquejo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2022-02-03T22:54:08.000Z","updated_at":"2022-02-03T22:55:08.000Z","dependencies_parsed_at":"2024-02-07T16:59:38.889Z","dependency_job_id":"f4f7b141-00d8-4621-9bcd-30b389af265f","html_url":"https://github.com/duquejo/Typescript-DesignPatterns","commit_stats":null,"previous_names":["duquejo/typescript-designpatterns"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/duquejo%2FTypescript-DesignPatterns","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/duquejo%2FTypescript-DesignPatterns/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/duquejo%2FTypescript-DesignPatterns/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/duquejo%2FTypescript-DesignPatterns/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/duquejo","download_url":"https://codeload.github.com/duquejo/Typescript-DesignPatterns/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243847061,"owners_count":20357317,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-22T08:27:17.212Z","updated_at":"2025-03-16T09:13:24.068Z","avatar_url":"https://github.com/duquejo.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Patrones de diseño\r\n\r\n## Tipos de patrones\r\n\r\n### Patrones creacionales\r\n\r\nSolucionan problemas de instancia o creación de objeto\r\n\r\n- Singleton\r\n\r\n  - Crear una sola instancia de una clase.\r\n  - Uso global de la misma.\r\n  - Ejemplo:\r\n    - Si se desea realizar una configuración de una única vez, es recomendable el uso de este patrón, ahorra recursos a través de una sola instancia de clase.\r\n    - Base de datos única (Si es dinámica éste es un antipatrón, ya que debería ser dinámico)\r\n\r\n- Factory\r\n\r\n  - Permite instanciar objetos en tiempo de ejecución\r\n  - Ejemplo:\r\n    - Módulos de ordenes de compra y cálculo de costos a través de un método de pago. (Paypal 6% retención, Visa 5% retención, MasterCard 10% retención), son métodos de pago que podrían tener una misma base, pero cuentan con parámetros a medida.\r\n\r\n- Abstract factory\r\n\r\n  - Agrupa familias de objetos para su creación, en una sola clase se agrupan una o muchas fábricas.\r\n  - Ejemplo:\r\n    - Debe publicarse un mensaje en distintas redes sociales y canales de chat (Facebook, LinkedIn, etc), para conectarnos a cada canal, necesitamos varias clases, una para conectarnos, otra para publicar, etc...\r\n    - Se vuelve complicado administrar tantos canales en una sola factoría y se olvida el principio de las fábricas que es concentrarse en la implementación más que en el comportamiento.\r\n\r\n### Patrones estructurales\r\n\r\nSolucionan problemas de relación de una clase con otra\r\n\r\n- Adapter\r\n\r\n  - Permite solucionar incompatibilidad entre clases\r\n  - Ejemplo:\r\n    - Tenemos código legacy que tiene una funcionalidad en particular. (Un publicador de Facebook) El requerimiento exige que ahora se agregarán otros proveedores como Slack y etc..\r\n    - La clase a adaptar debe implementar una interfaz, y todo se resuelve de manera polifórmica a través de la interfaz.\r\n    - No se puede refactorizar, debido a que ya está en producción y las nuevas librerías a agregar no son modificables, ambas deben adaptarse.\r\n\r\n- Decorator\r\n\r\n  - Permite agregar comportamiento sin alterar su estructura, todo en tiempo de ejecución.\r\n  - Si se piensa por capas, cada capa añadida extra da funcionalidades diferentes, pero no modifica la esencia del mismo\r\n    - Al anidar los decoradores, serán ejecutados en orden de pila, es decir, primero el último y así sucesivamente.\r\n  - Ejemplo:\r\n    - Una tienda de música da descuentos de acurdo a la primera compra del usuario, con base al cliente y a la campaña actual. Posiblemente una estructura de condicionales puede solucionarlo, pero y ¿si se agregan N cantidad de descuentos?.\r\n    - Este patrón también aplica para combinaciones entre comportamiento de clases.\r\n\r\n- Proxy\r\n\r\n  - Trabaja como intermediario para cambiar el comportamiento de una clase sin cambiar su estructura. Con esto evitamos que el comportamiento original sea alterado.\r\n  - Ejemplo:\r\n    - Un sitio web tiene un flujo de visitas muy grande y debido al alto flujo, el proveedor de servicio puede generar delays o sanciones debido a que no es capaz de soportar tanto.\r\n      - La solución entonces sería crear un proxy que se conecte a este recurso del sitio web y almacene todo en caché local para su uso posterior.\r\n\r\n### Patrones de comportamiento\r\n\r\nMejor propuesta a la forma en que se maneja la interacción y responsabilidades entre clases o de algoritmos implementados.\r\n\r\n- Command\r\n  - Permite resolver una operación sin conocer el contenido de esta o el receptor. El sólamente ejecuta una tarea. lo que contenga le da igual. Sólo expone el contrato, de la ejecución se encarga él. Proporciona el beneficio de la segregación.\r\n- Observer\r\n  - Permite que un objeto publicador pueda notificar un evento a los suscriptores.\r\n  - Ejemplo:\r\n    - Al realizar un usuario una compra en una plataforma, automáticamente se envía un SMS y un Email notificando la transacción.\r\n- Strategy\r\n  - Permite definir una familia de algoritmos para cambiar el comportamiento de la aplicación en tiempo de ejecución.\r\n  - Ejemplo: La empresa que actualmente trabaja con Paypal, añadió nuevas formas de pago, convenio con VISA y MasterCard.\r\n\r\n## Lenguaje de trabajo\r\n\r\nTypeScript\r\n\r\n## Referencias\r\n\r\nHead first design patterns O'reilly\r\n\r\n- Eric Freeman\r\n- Elisabetg Robson\r\n\r\nDesign Patterns Element of reusable Object-oriented software\r\n\r\n- Erich Gamma\r\n- Richard Helm\r\n- Ralph Johnson\r\n- John Vlissides\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fduquejo%2Ftypescript-designpatterns","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fduquejo%2Ftypescript-designpatterns","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fduquejo%2Ftypescript-designpatterns/lists"}