
Wzorzec fabryczny w języku C# (jak działa dla programistów)
Wzorzec fabryczny w języku C# to podejście strukturalne należące do kategorii wzorców projektowych. Wzorzec projektowy Factory Method w języku C# ma na celu rozwiązywanie problemów związanych z tworzeniem obiektów bez określania dokładnej klasy tworzącej obiekt, który zostanie utworzony.
Zasadniczo wzorzec fabryczny zajmuje się tworzeniem obiektów poprzez delegowanie tego zadania do konkretnej klasy, znanej jako klasa fabryczna. Dzięki temu system jest bardziej elastyczny i łatwiejszy w zarządzaniu, zwłaszcza przy wprowadzaniu nowych typów obiektów, ponieważ klasa fabryczna obsługuje proces tworzenia obiektów, zmniejszając zależność od klas konkretnych. Przyjrzyjmy się, jak można zaimplementować i wykorzystać wzorzec Factory Method, czyli wzorzec projektowy typu kreacyjnego w języku C#. Bibliotekę IronPDF PDF Generation Library omówimy później.
Podstawowa struktura wzorca metody fabrycznej
Główną ideą wzorca metody fabrycznej jest zdefiniowanie wspólnego interfejsu do tworzenia obiektów, przy jednoczesnym umożliwieniu podklasom zmiany typu tworzonych obiektów. Ten wzorzec obejmuje kilka kluczowych elementów:
- Interfejs produktu: Określa strukturę obiektów tworzonych przez metodę fabryczną.
- Konkretne klasy produktów: Implementują interfejs produktu.
- Klasa Creator (klasa abstrakcyjna Creator): Deklaruje metodę fabryczną, która zwraca obiekt interfejsu produktu.
- Concrete Creator: Modyfikuje metodę fabryczną w celu dostarczenia instancji konkretnego produktu.
Przykład: Fabryka pojazdów
Rozważmy scenariusz, w którym mamy różne rodzaje pojazdów, takie jak samochody osobowe i ciężarówki. Wykorzystamy wzorzec fabryczny do stworzenia fabryki pojazdów, która może tworzyć różne typy pojazdów na podstawie danych wprowadzonych przez użytkownika lub pliku konfiguracyjnego.
Krok 1: Zdefiniuj interfejs produktu
public interface IVehicle
{
// Method to display information about the vehicle
void DisplayInfo();
}Public Interface IVehicle
' Method to display information about the vehicle
Sub DisplayInfo()
End InterfaceKrok 2: Wdrożenie konkretnych produktów
public class Car : IVehicle
{
// Displays Car specific information
public void DisplayInfo()
{
Console.WriteLine("This is a Car.");
}
}
public class Truck : IVehicle
{
// Displays Truck specific information
public void DisplayInfo()
{
Console.WriteLine("This is a Truck.");
}
}Public Class Car
Implements IVehicle
' Displays Car specific information
Public Sub DisplayInfo()
Console.WriteLine("This is a Car.")
End Sub
End Class
Public Class Truck
Implements IVehicle
' Displays Truck specific information
Public Sub DisplayInfo()
Console.WriteLine("This is a Truck.")
End Sub
End ClassKrok 3: Utwórz klasę tworzącą abstrakcję
public abstract class VehicleFactory
{
// Factory Method to create a vehicle instance
public abstract IVehicle CreateVehicle(string type);
}Public MustInherit Class VehicleFactory
' Factory Method to create a vehicle instance
Public MustOverride Function CreateVehicle(ByVal type As String) As IVehicle
End ClassKrok 4: Wdrożenie Concrete Creator
public class ConcreteVehicleFactory : VehicleFactory
{
public override IVehicle CreateVehicle(string type)
{
// Create vehicle based on type
switch (type.ToLower())
{
case "car": return new Car();
case "truck": return new Truck();
default: throw new ArgumentException("Invalid vehicle type");
}
}
}Public Class ConcreteVehicleFactory
Inherits VehicleFactory
Public Overrides Function CreateVehicle(ByVal type As String) As IVehicle
' Create vehicle based on type
Select Case type.ToLower()
Case "car"
Return New Car()
Case "truck"
Return New Truck()
Case Else
Throw New ArgumentException("Invalid vehicle type")
End Select
End Function
End ClassKrok 5: Wykorzystanie kodu klienta
class Program
{
static void Main(string[] args)
{
// Create factory instance
VehicleFactory factory = new ConcreteVehicleFactory();
// Create a Car and display its info
IVehicle car = factory.CreateVehicle("car");
car.DisplayInfo();
// Create a Truck and display its info
IVehicle truck = factory.CreateVehicle("truck");
truck.DisplayInfo();
}
}Friend Class Program
Shared Sub Main(ByVal args() As String)
' Create factory instance
Dim factory As VehicleFactory = New ConcreteVehicleFactory()
' Create a Car and display its info
Dim car As IVehicle = factory.CreateVehicle("car")
car.DisplayInfo()
' Create a Truck and display its info
Dim truck As IVehicle = factory.CreateVehicle("truck")
truck.DisplayInfo()
End Sub
End ClassW powyższym przykładzie klasa VehicleFactory pełni rolę abstrakcyjnego kreatora, a klasa ConcreteVehicleFactory jest konkretnym kreatorem, który implementuje metodę fabryczną CreateVehicle. Ta metoda decyduje, jaki typ pojazdu utworzyć na podstawie otrzymanych danych wejściowych. Kod klienta wykorzystuje następnie fabrykę do tworzenia instancji różnych pojazdów, co sprzyja luźnemu powiązaniu między logiką tworzenia obiektów a kodem klienta.

Zalety stosowania wzorca fabrycznego
Wzorzec fabryczny oferuje kilka zalet, zwłaszcza w złożonych systemach:
- Luźne sprzężenie: Kod klienta współdziała z interfejsami lub klasami abstrakcyjnymi zamiast z konkretnymi klasami produktów. Wynikiem tego jest projekt, który jest bardziej elastyczny i łatwiejszy do modyfikacji.
- Oprogramowanie obiektowe wielokrotnego użytku: Wzorzec fabryczny sprzyja ponownemu wykorzystaniu kodu, ponieważ oddziela logikę tworzenia obiektów od systemu, ułatwiając jego utrzymanie i rozbudowę.
- Elastyczność w tworzeniu obiektów: Metoda fabryczna pozwala na różne implementacje tworzenia obiektów, które można wybierać w czasie wykonywania. Jest to szczególnie przydatne w sytuacjach, w których typ wymaganych obiektów może się różnić w zależności od czynników zewnętrznych.
IronPDF: Rozwiązanie PDF dla platformy .NET

IronPDF to biblioteka zaprojektowana dla platformy .NET, pomagająca programistom w łatwym tworzeniu, edytowaniu i manipulowaniu plikami PDF bezpośrednio z HTML, CSS, obrazów i JavaScript, bez konieczności zagłębiania się w skomplikowane API do generowania plików PDF. Jej główną zaletą jest możliwość szybkiego i bardzo dokładnego przekształcania treści internetowych w dokumenty PDF dzięki wykorzystaniu silnika renderującego opartego na przeglądarce Chrome.
Kluczowe funkcje obejmują generowanie plików PDF z ciągów znaków HTML lub adresów URL, renderowanie stron internetowych jako plików PDF w locie oraz możliwość pracy między innymi z aplikacjami formularzowymi, aplikacjami serwerowymi i bezpiecznymi intranetami. Jego wydajność jest zoptymalizowana pod kątem efektywności, z możliwością operacji asynchronicznych, niestandardowego logowania oraz obszernej dokumentacji, która pomoże Ci szybko rozpocząć pracę.
IronPDF wyróżnia się w konwersji HTML do PDF, zapewniając precyzyjne zachowanie oryginalnych układów i stylów. Idealnie nadaje się do tworzenia plików PDF z treści internetowych, takich jak raporty, faktury i dokumentacja. Dzięki obsłudze plików HTML, adresów URL i surowych ciągów znaków HTML, IronPDF z łatwością tworzy wysokiej jakości dokumenty PDF.
using IronPdf;
class Program
{
static void Main(string[] args)
{
// Initialize a Pdf Renderer with a Chrome Rendering Engine
var renderer = new ChromePdfRenderer();
// 1. Convert HTML String to PDF
var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");
// 2. Convert HTML File to PDF
var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");
// 3. Convert URL to PDF
var url = "http://ironpdf.com"; // Specify the URL
var pdfFromUrl = renderer.RenderUrlAsPdf(url);
pdfFromUrl.SaveAs("URLToPDF.pdf");
}
}Imports IronPdf
Friend Class Program
Shared Sub Main(ByVal args() As String)
' Initialize a Pdf Renderer with a Chrome Rendering Engine
Dim renderer = New ChromePdfRenderer()
' 1. Convert HTML String to PDF
Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")
' 2. Convert HTML File to PDF
Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")
' 3. Convert URL to PDF
Dim url = "http://ironpdf.com" ' Specify the URL
Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
pdfFromUrl.SaveAs("URLToPDF.pdf")
End Sub
End ClassPrzykład kodu
Aby zilustrować, w jaki sposób IronPDF można zintegrować z wzorcem fabrycznym, stwórzmy uproszczony przykład. Wzorzec fabryczny to rodzaj wzorca projektowego tworzenia, który oferuje sposób na tworzenie konkretnych produktów lub obiektów w ramach klasy nadrzędnej, pozwalając podklasom na modyfikowanie konkretnych obiektów, które są wytwarzane. Doskonale wpisuje się to w tworzenie różnych typów dokumentów PDF w oparciu o konkretne potrzeby, np. na podstawie ciągów HTML, adresów URL lub plików.
Stworzymy interfejs o nazwie IPdfCreator, który definiuje metodę tworzenia plików PDF, a następnie zaimplementujemy różne klasy fabryczne, które tworzą pliki PDF na różne sposoby przy użyciu IronPDF.
Krok 1: Zdefiniuj interfejs IPdfCreator
Ten interfejs deklaruje metodę CreatePdf, którą zaimplementują wszystkie konkretne fabryki.
public interface IPdfCreator
{
// Method responsible for creating a PDF
void CreatePdf(string source);
}Public Interface IPdfCreator
' Method responsible for creating a PDF
Sub CreatePdf(ByVal source As String)
End InterfaceKrok 2: Wdrożenie fabryk konkretów
W tym miejscu definiujemy dwa konkretne wdrożenia IPdfCreator: jedno do tworzenia plików PDF z ciągów znaków HTML, a drugie z adresów URL.
public class HtmlStringPdfCreator : IPdfCreator
{
// Creates a PDF from an HTML string
public void CreatePdf(string htmlString)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlString);
pdf.SaveAs("HtmlStringPdf.pdf");
}
}
// Create PDF from a given URL
public class UrlPdfCreator : IPdfCreator
{
public void CreatePdf(string url)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf(url);
pdf.SaveAs("UrlPdf.pdf");
}
}Public Class HtmlStringPdfCreator
Implements IPdfCreator
' Creates a PDF from an HTML string
Public Sub CreatePdf(ByVal htmlString As String)
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlString)
pdf.SaveAs("HtmlStringPdf.pdf")
End Sub
End Class
' Create PDF from a given URL
Public Class UrlPdfCreator
Implements IPdfCreator
Public Sub CreatePdf(ByVal url As String)
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf(url)
pdf.SaveAs("UrlPdf.pdf")
End Sub
End ClassKrok 3: Korzystanie z Factory
W swojej aplikacji możesz teraz używać tych fabryk do tworzenia dokumentów PDF z różnych źródeł, nie martwiąc się o szczegóły procesu tworzenia plików PDF.
class Program
{
static void Main(string[] args)
{
// Add your IronPDF license key
License.LicenseKey = "License-Key";
// Create PDF from HTML string
IPdfCreator htmlPdfCreator = new HtmlStringPdfCreator();
htmlPdfCreator.CreatePdf("<h1>Hello, World!</h1>");
// Create PDF from URL
IPdfCreator urlPdfCreator = new UrlPdfCreator();
urlPdfCreator.CreatePdf("http://example.com");
}
}Friend Class Program
Shared Sub Main(ByVal args() As String)
' Add your IronPDF license key
License.LicenseKey = "License-Key"
' Create PDF from HTML string
Dim htmlPdfCreator As IPdfCreator = New HtmlStringPdfCreator()
htmlPdfCreator.CreatePdf("<h1>Hello, World!</h1>")
' Create PDF from URL
Dim urlPdfCreator As IPdfCreator = New UrlPdfCreator()
urlPdfCreator.CreatePdf("http://example.com")
End Sub
End ClassW tym kontekście HtmlStringPdfCreator i UrlPdfCreator to konkretne fabryki, które generują pliki PDF. Klasa Program, pełniąca rolę klienta, korzysta z tych fabryk bez konieczności znajomości skomplikowanych szczegółów dotyczących generowania plików PDF na podstawie ciągów znaków HTML lub adresów URL. Takie podejście zapewnia elastyczność, ponieważ można wprowadzać nowe sposoby tworzenia plików PDF (np. z plików lub strumieni) po prostu poprzez dodanie kolejnych fabryk implementujących interfejs IPdfCreator, zgodnie z zasadą otwartości i zamkniętości w projektowaniu obiektowym.
Wynik
Poniższe zrzuty ekranu przedstawiają wynik działania kodu:


Wnioski

Wzorzec fabryczny w języku C# zapewnia strukturę do zarządzania tworzeniem obiektów, dzięki czemu projekt oprogramowania jest łatwiejszy w utrzymaniu i rozbudowie. Wykorzystując konkretne klasy do implementacji abstrakcyjnej fabryki i delegowania logiki tworzenia, programiści mogą tworzyć systemy, które łatwiej dostosować i rozbudować. Niezależnie od tego, czy mamy do czynienia z kilkoma klasami, czy z systemem o złożonych zależnościach, wzorzec fabryczny oferuje ustrukturyzowane podejście do precyzyjnego tworzenia obiektów klas. Jest to szczególnie przydatne w sytuacjach, w których typ tworzonych obiektów może się różnić w zależności od danych wprowadzonych przez użytkownika, konfiguracji lub stanu aplikacji.
IronPDF oferuje bezpłatną wersję próbną IronPDF na start, a opcje licencji zaczynają się od liteLicense, dzięki czemu zaspokajają potrzeby deweloperów, którzy chcą zintegrować funkcje PDF w swoich aplikacjach .NET.

Jacob Mellor jest Chief Technology Officer w Iron Software i wizjonerskim inżynierem, pionierem technologii C# PDF. Jako pierwotny deweloper głównej bazy kodowej Iron Software, kształtuje architekturę produktów firmy od jej początku, przekształcając ją wspólnie z CEO Cameron Rimington w firmę liczącą ponad 50 osób, obsługującą NASA, Teslę i światowe agencje rządowe.
Powiązane artykuły


