Menu
Coddy logo textTech

Patrón Factory

Parte de la sección Programación Orientada a Objetos del Journey de GO de Coddy. Lección 87 de 107.

El patrón Factory delega la creación de objetos a una función o método independiente, lo que te permite crear instancias sin exponer la lógica de creación. A diferencia de Singleton, que controla el número de instancias, Factory se centra en la creación flexible de objetos según los parámetros de entrada.

En Go, una fábrica suele ser una función que devuelve un tipo de interfaz, lo que permite crear distintos tipos concretos mediante una API unificada:

type Notifier interface {
    Send(message string) string
}

type EmailNotifier struct{}
type SMSNotifier struct{}

func (e EmailNotifier) Send(message string) string {
    return "Email: " + message
}

func (s SMSNotifier) Send(message string) string {
    return "SMS: " + message
}

func NewNotifier(notifierType string) Notifier {
    switch notifierType {
    case "email":
        return EmailNotifier{}
    case "sms":
        return SMSNotifier{}
    default:
        return EmailNotifier{}
    }
}

La función de fábrica NewNotifier encapsula la decisión de qué tipo concreto crear. El código del cliente solo trabaja con la interfaz Notifier, sin conocer la implementación específica:

notifier := NewNotifier("sms")
result := notifier.Send("Hello!")  // "SMS: Hello!"

Este patrón destaca cuando necesitas crear objetos en función de condiciones de ejecución, quieres centralizar una lógica de inicialización compleja o necesitas añadir fácilmente nuevos tipos sin modificar el código del cliente. Simplemente añade una nueva estructura que implemente la interfaz y actualiza la función de fábrica.

challenge icon

Desafío

Fácil

¡Construyamos un sistema de conversión de documentos usando el patrón Factory! Crearás una fábrica que produce distintos convertidores de documentos según el formato de destino, lo que permite que el código cliente trabaje con cualquier convertidor mediante una interfaz unificada.

Organizarás tu código en dos archivos:

  • converter.go: Define tu interfaz de convertidor y las implementaciones concretas.

    Crea una interfaz Converter con un método Convert(content string) string que recibe el contenido del documento y devuelve el resultado convertido.

    Implementa tres tipos de convertidores:

    • PDFConverter: su método Convert devuelve PDF: [content]
    • HTMLConverter: su método Convert devuelve HTML: <p>[content]</p>
    • MarkdownConverter: su método Convert devuelve MD: # [content]

    Crea una función de fábrica NewConverter(format string) Converter que devuelva el convertidor apropiado según la cadena de formato (pdf, html o markdown). Para cualquier formato no reconocido, devuelve un PDFConverter como valor predeterminado.

  • main.go: Usa tu fábrica para crear convertidores y procesar documentos.

    Lee un tipo de formato y el contenido de un documento. Usa la fábrica para crear el convertidor apropiado, después convierte el contenido e imprime el resultado.

Se proporcionarán las siguientes entradas:

  • Línea 1: Tipo de formato (pdf, html, markdown o cualquier otra cosa)
  • Línea 2: Contenido del documento que se convertirá

Por ejemplo, dada la siguiente entrada:

html
Welcome to Go Programming

Tu salida debería ser:

HTML: <p>Welcome to Go Programming</p>

Y dada la siguiente entrada:

markdown
Chapter One

Tu salida debería ser:

MD: # Chapter One

Y dada la siguiente entrada:

pdf
Annual Report 2024

Tu salida debería ser:

PDF: Annual Report 2024

Y dada la siguiente entrada:

docx
Meeting Notes

Tu salida debería ser:

PDF: Meeting Notes

Observa cómo el código principal no necesita conocer los tipos de convertidores específicos. Simplemente le pide un convertidor a la fábrica y usa la interfaz. ¡Esto facilita añadir nuevos formatos más adelante sin cambiar el código cliente!

Pruébalo tú mismo

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// Leer el tipo de formato
	scanner.Scan()
	format := scanner.Text()
	
	// Leer el contenido del documento
	scanner.Scan()
	content := scanner.Text()
	
	// TODO: Usa la factory para crear el convertidor apropiado
	// TODO: Convierte el contenido e imprime el resultado
	
	fmt.Println(result)
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Go online