
Padrão Factory em C# (Como funciona para desenvolvedores)
O padrão Factory em C# é uma abordagem estrutural que pertence à categoria de padrões de projeto. O padrão de projeto Factory Method em C# visa resolver problemas relacionados à criação de objetos sem especificar a classe criadora exata do objeto a ser criado.
Essencialmente, o padrão Factory lida com a criação de objetos delegando-a a uma classe específica, conhecida como classe de fábrica. Isso permite que um sistema seja mais flexível e fácil de gerenciar, especialmente ao introduzir novos tipos de objetos, já que a classe de fábrica lida com o processo de criação do objeto, reduzindo a dependência das classes concretas. Vamos explorar como o padrão Factory Method, um padrão de projeto de criação em C#, pode ser implementado e utilizado. Exploraremos a biblioteca de geração de PDF do IronPDF mais tarde.
Estrutura do padrão do método básico de fábrica
A ideia central por trás do padrão de método de fábrica é definir uma interface comum para a criação de objetos, permitindo que as subclasses alterem o tipo de objetos que criam. Esse padrão envolve alguns componentes-chave:
- Interface do Produto: Especifica a estrutura dos objetos criados pelo método de fábrica.
- Classes de produto concretas: Implemente a interface do produto.
- Classe Criadora (Classe Abstrata Criadora): Declara o método de fábrica, que retorna um objeto da interface do produto.
- Criador de Concreto: Modifica o método de fábrica para entregar uma instância do produto de concreto.
Exemplo: Fábrica de Veículos
Considere um cenário em que temos diferentes tipos de veículos, como carros e caminhões. Usaremos o padrão Factory para criar uma fábrica de veículos que possa produzir diferentes tipos de veículos com base na entrada do usuário ou em um arquivo de configuração.
Etapa 1: Defina a interface do produto
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 InterfaceEtapa 2: Implementar Produtos Concretos
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 ClassPasso 3: Criar a classe Abstract Creator
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 ClassEtapa 4: Implementar o Criador Concreto
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 ClassEtapa 5: Utilização do código do cliente
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 ClassNo exemplo acima, a classe VehicleFactory serve como criadora abstrata, enquanto a classe ConcreteVehicleFactory é a criadora concreta que implementa o método de fábrica CreateVehicle . Este método decide qual tipo de veículo criar com base na entrada recebida. O código do cliente utiliza então a fábrica para criar instâncias de diferentes veículos, promovendo um baixo acoplamento entre a lógica de criação de objetos e o código do cliente.

Vantagens de usar o padrão de fábrica
O modelo de fábrica oferece diversas vantagens, especialmente em sistemas complexos:
- Acoplamento fraco: O código do cliente interage com interfaces ou classes abstratas em vez de classes de produto concretas. Isso resulta em um design mais flexível e fácil de modificar. Software orientado a objetos reutilizável: O padrão Factory promove a reutilização de código, pois separa a lógica de criação de objetos do sistema, tornando o sistema mais fácil de manter e estender. Flexibilidade na criação de objetos: O método de fábrica permite diferentes implementações para a criação de objetos, que podem ser selecionadas em tempo de execução. Isso é especialmente útil em cenários onde o tipo de objeto necessário pode variar de acordo com fatores externos.
IronPDF: Solução .NET para PDF

IronPDF é uma biblioteca desenvolvida para a plataforma .NET , que auxilia desenvolvedores a criar, editar e manipular arquivos PDF diretamente de HTML , CSS, imagens e JavaScript, sem a necessidade de recorrer a APIs complexas de geração de PDFs. Seu principal diferencial reside na capacidade de transformar conteúdo da web em documentos PDF de forma rápida e precisa, graças ao uso de um mecanismo de renderização baseado no Chrome.
Entre os principais recursos, destacam-se a geração de PDFs a partir de strings HTML ou URLs, a renderização de páginas da web como PDFs em tempo real e a capacidade de trabalhar com aplicativos de formulários, aplicativos de servidor e intranets seguras, entre outros. Seu desempenho é otimizado para eficiência, com recursos para operações assíncronas, registro personalizado e documentação completa para ajudá-lo a começar rapidamente.
O IronPDF se destaca na conversão de HTML para PDF , garantindo a preservação precisa dos layouts e estilos originais. É perfeito para criar PDFs a partir de conteúdo da web, como relatórios, faturas e documentação. Com suporte para arquivos HTML, URLs e strings HTML brutas, o IronPDF produz facilmente documentos PDF de alta qualidade.
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 ClassExemplo de código
Para ilustrar como o IronPDF pode ser integrado ao padrão Factory, vamos criar um exemplo simplificado. O padrão Factory é um tipo de padrão de projeto criacional que oferece uma maneira de criar produtos ou objetos concretos dentro de uma superclasse, permitindo que as subclasses modifiquem os objetos específicos que estão sendo produzidos. Isso se encaixa bem na criação de diferentes tipos de documentos PDF com base em necessidades específicas, como a partir de strings HTML, URLs ou arquivos.
Criaremos uma interface chamada IPdfCreator que define um método para criar PDFs e, em seguida, implementaremos diferentes classes de fábrica que criam PDFs de várias maneiras usando o IronPDF.
Passo 1: Defina a interface IPdfCreator
Esta interface declara o método CreatePdf que todas as fábricas concretas implementarão.
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 InterfaceEtapa 2: Implementar fábricas de concreto
Aqui definimos duas implementações concretas de IPdfCreator: uma para criar PDFs a partir de strings HTML e outra a partir de URLs.
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 ClassEtapa 3: Utilizando a Fábrica
Em sua aplicação, agora você pode usar essas fábricas para criar documentos PDF a partir de diferentes fontes, sem se preocupar com os detalhes do processo de criação do 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 ClassNessa configuração, HtmlStringPdfCreator e UrlPdfCreator são fábricas concretas que produzem PDFs. A classe Program , atuando como cliente, utiliza essas fábricas sem precisar conhecer os detalhes complexos de como os PDFs são gerados a partir de strings HTML ou URLs. Essa abordagem proporciona flexibilidade, pois permite introduzir novas formas de criar PDFs (por exemplo, a partir de arquivos ou fluxos) simplesmente adicionando mais fábricas que implementam a interface IPdfCreator , seguindo o Princípio Aberto/Fechado do design orientado a objetos.
Saída
As capturas de tela a seguir mostram o resultado do código:


Conclusão
O padrão Factory em C# fornece uma estrutura para gerenciar a criação de objetos, tornando o design de software mais fácil de manter e extensível. Ao usar classes concretas para implementar uma fábrica abstrata e delegar a lógica de criação, os desenvolvedores podem criar sistemas mais fáceis de adaptar e expandir. Seja lidando com algumas poucas classes ou com um sistema com dependências complexas, o padrão Factory oferece uma abordagem estruturada para a criação precisa de objetos de classe. É particularmente vantajoso em cenários onde o tipo de objetos a serem criados pode variar de acordo com a entrada do usuário, a configuração ou o estado do aplicativo.
IronPDF oferece uma avaliação gratuita do IronPDF para começar, e as opções de licença começam em liteLicense, atendendo a desenvolvedores que buscam integrar funcionalidades de PDF em seus aplicativos .NET.

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais bem estruturados e visualmente atraentes.
Artigos relacionados


