Patrón de Diseño Factory en Go: Creación y Uso Práctico
Clase 9 de 19 • Curso de Go Avanzado: Concurrencia y Patrones de Diseño
Contenido del curso
Concurrencia
- 2

Condiciones de Carrera en Programación Concurrente con Go
04:52 min - 3

Evitar Condiciones de Carrera en Go con Mutex y WaitGroup
11:26 min - 4

Lectura y Escritura Concurrente en Go con RWMutex
06:15 min - 5

Creación de un Sistema de Caché Concurrente en Go
14:29 min - 6

Manejo de Condiciones de Carrera en Go: Implementación de Mutex
08:52 min - 7

Cache concurrente en Go para cálculos intensivos de Fibonacci
16:31 min
Patrones de diseño
- 8

Patrones de Diseño en Programación Orientada a Objetos con Go
04:53 min - 9

Patrón de Diseño Factory en Go: Creación y Uso Práctico
Viendo ahora - 10

Implementación de Singleton en Go para Conexiones de Base de Datos
08:48 min - 11

Patrón de Diseño Adapter en Go: Implementación Práctica
09:51 min - 12

Patrón de Diseño Observer en Go: Implementación Práctica
11:59 min - 13

Implementación del Patrón de Diseño Strategy en Go
08:53 min
Net
- 14

Escaneo de Puertos TCP con Go: Introducción Básica
07:45 min - 15

Concurrencia en Go: Escáner de Puertos Eficiente y Personalizable
09:16 min - 16

Implementación de NetCAD como Cliente TCP en Go
10:14 min - 17

Construcción de Back End para Servidor de Chat en Go
16:08 min - 18

Implementación de un Servidor de Chat en Go con TCP
13:54 min
Conclusión
¿Qué son los patrones de diseño y cómo nos ayudan?
Los patrones de diseño son soluciones comunes a problemas habituales en el desarrollo de software. Estos patrones facilitan la reutilización de código, mejoran la comprensión y fomentan buenas prácticas de programación. Hoy exploraremos el patrón de diseño Factory, un patrón creacional que permite crear fábricas de objetos flexibles y escalables.
¿Cómo implementar el patrón Factory en Go?
Para comenzar, crearemos una interfaz básica y las estructuras necesarias implementándolas en lenguaje Go. Veamos el proceso paso a paso:
-
Crear la interfaz base: Primero, definimos una interfaz, llamada
iProduct, que exigirá la implementación de varios métodos esenciales:type iProduct interface { setStock(stock int) getStock() int setName(name string) getName() string } -
Definir estructuras concretas: Ahora, definimos nuestra estructura
Computery sus métodos para cumplir con la interfaziProduct.type Computer struct { name string stock int } func (c *Computer) setStock(stock int) { c.stock = stock } func (c *Computer) getStock() int { return c.stock } func (c *Computer) setName(name string) { c.name = name } func (c *Computer) getName() string { return c.name } -
Composición sobre herencia: Creamos subclases como
LaptopyDesktop, usando composición en Go en lugar de herencia.type Laptop struct { Computer } func newLaptop() iProduct { return &Laptop{Computer{name: "Laptop Computer", stock: 25}} } type Desktop struct { Computer } func newDesktop() iProduct { return &Desktop{Computer{name: "Desktop Computer", stock: 35}} } -
Implementar el Factory: El siguiente paso es crear la función
getComputerFactoryque utiliza el patrón Factory para devolver el producto adecuado.func getComputerFactory(computerType string) (iProduct, error) { if computerType == "laptop" { return newLaptop(), nil } else if computerType == "desktop" { return newDesktop(), nil } return nil, fmt.Errorf("Invalid computer type") }
¿Por qué usar el patrón Factory?
El patrón Factory nos ofrece múltiples beneficios:
- Flexibilidad: Nos permite ampliar el número de productos a crear sin modificar el código existente.
- Polimorfismo: Todas las instancias son tratadas como
iProduct, promoviendo el uso del polimorfismo y la reutilización de código. - Mantenimiento: Centraliza y simplifica la gestión de instancias permitiendo modificaciones en un solo lugar.
¿Cómo probar y verificar la implementación?
Crear una función de impresión para visualizar los resultados y verificar el comportamiento polimorfo:
func printNameAndStock(p iProduct) {
fmt.Printf("Product Name: %s, Stock: %d\n", p.getName(), p.getStock())
}
func main() {
laptop, _ := getComputerFactory("laptop")
desktop, _ := getComputerFactory("desktop")
printNameAndStock(laptop)
printNameAndStock(desktop)
}
Ejecutando este código comprobarás que las instancias de Laptop y Desktop son tratadas adecuadamente como instancias de iProduct.
¿Cuáles son los pros y contras del patrón Factory?
El uso del patrón Factory ofrece claridad en la creación de objetos y flexibilidad para añadir nuevos productos. Sin embargo, puede hacer que el código sea más complejo y difícil de leer, especialmente para novatos en programación.
Al enfrentar la complejidad inicial, el patrón Factory se convierte en una herramienta poderosa para arquitecturas de software robustas. ¡Continúa explorando más patrones de diseño para seguir perfeccionando tus habilidades!