Menu
Coddy logo textTech

Wzorzec Factory

Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 87 z 107.

Wzorzec fabryki deleguje tworzenie obiektów do osobnej funkcji lub metody, umożliwiając tworzenie instancji bez ujawniania logiki ich tworzenia. W przeciwieństwie do Singletona, który kontroluje liczbę instancji, fabryka koncentruje się na elastycznym tworzeniu obiektów w zależności od parametrów wejściowych.

W Go fabryka to zazwyczaj funkcja zwracająca typ interfejsowy, dzięki czemu można tworzyć różne typy konkretne za pośrednictwem ujednoliconego API:

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{}
    }
}

Funkcja fabrykująca NewNotifier kapsułkuje decyzję o tym, jaki konkretny typ utworzyć. Kod klienta korzysta wyłącznie z interfejsu Notifier, nie wiedząc, jaka jest konkretna implementacja:

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

Ten wzorzec sprawdza się, gdy chcesz tworzyć obiekty na podstawie warunków czasu wykonania, scentralizować złożoną logikę inicjalizacji lub łatwo dodawać nowe typy bez modyfikowania kodu klienta. Wystarczy dodać nową strukturę implementującą interfejs i zaktualizować funkcję fabrykującą.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system konwerterów dokumentów z użyciem wzorca Fabryki! Utworzysz fabrykę, która tworzy różne konwertery dokumentów na podstawie formatu docelowego, dzięki czemu kod klienta może współpracować z dowolnym konwerterem za pośrednictwem ujednoliconego interfejsu.

Rozmieścisz kod w dwóch plikach:

  • converter.go: Zdefiniuj interfejs konwertera i jego konkretne implementacje.

    Utwórz interfejs Converter z metodą Convert(content string) string, która przyjmuje treść dokumentu i zwraca przekonwertowany wynik.

    Zaimplementuj trzy typy konwerterów:

    • PDFConverter: jego metoda Convert zwraca PDF: [content]
    • HTMLConverter: jego metoda Convert zwraca HTML: <p>[content]</p>
    • MarkdownConverter: jego metoda Convert zwraca MD: # [content]

    Utwórz funkcję fabrykującą NewConverter(format string) Converter, która zwraca odpowiedni konwerter na podstawie ciągu formatu (pdf, html lub markdown). W przypadku nierozpoznanego formatu zwróć PDFConverter jako domyślny.

  • main.go: Użyj fabryki, aby utworzyć konwertery i przetwarzać dokumenty.

    Wczytaj typ formatu i treść dokumentu. Użyj fabryki, aby utworzyć odpowiedni konwerter, a następnie przekonwertuj treść i wyświetl wynik.

Dane wejściowe będą miały następującą postać:

  • Wiersz 1: Typ formatu (pdf, html, markdown lub inny)
  • Wiersz 2: Treść dokumentu do przekonwertowania

Na przykład dla danych:

html
Welcome to Go Programming

Wynik powinien być następujący:

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

A dla danych:

markdown
Chapter One

Wynik powinien być następujący:

MD: # Chapter One

A dla danych:

pdf
Annual Report 2024

Wynik powinien być następujący:

PDF: Annual Report 2024

A dla danych:

docx
Meeting Notes

Wynik powinien być następujący:

PDF: Meeting Notes

Zwróć uwagę, że kod główny nie musi znać konkretnych typów konwerterów. Po prostu prosi fabrykę o konwerter i korzysta z interfejsu. Dzięki temu można łatwo dodawać nowe formaty bez zmieniania kodu klienta!

Spróbuj swoich sił

package main

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

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// Odczytaj typ formatu
	scanner.Scan()
	format := scanner.Text()
	
	// Odczytaj zawartość dokumentu
	scanner.Scan()
	content := scanner.Text()
	
	// TODO: Użyj fabryki, aby utworzyć odpowiedni konwerter
	// TODO: Przekonwertuj zawartość i wypisz wynik
	
	fmt.Println(result)
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Go online