Ir para o conteúdo do rodapé
AJUDA DO .NET

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
    void DisplayInfo();
}
Public Interface IVehicle
	' Method to display information about the vehicle
	Sub DisplayInfo()
End Interface
$vbLabelText   $csharpLabel

Etapa 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 : 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 Class
$vbLabelText   $csharpLabel

Passo 3: Criar a classe Abstract Creator

public abstract class VehicleFactory
{
    // Factory Method to create a vehicle instance
    public abstract IVehicle CreateVehicle(string type);
}
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 Class
$vbLabelText   $csharpLabel

Etapa 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 : 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 Class
$vbLabelText   $csharpLabel

Etapa 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();
    }
}
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 Class
$vbLabelText   $csharpLabel

No 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.

Padrão Factory em C# (Como funciona para desenvolvedores): Figura 1 - Saída do padrão de projeto Factory

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

Padrão Factory em C# (Como funciona para desenvolvedores): Figura 2 - IronPDF

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");
    }
}
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 Class
$vbLabelText   $csharpLabel

Exemplo 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
    void CreatePdf(string source);
}
Public Interface IPdfCreator
	' Method responsible for creating a PDF
	Sub CreatePdf(ByVal source As String)
End Interface
$vbLabelText   $csharpLabel

Etapa 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 : 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 Class
$vbLabelText   $csharpLabel

Etapa 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");
    }
}
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 Class
$vbLabelText   $csharpLabel

Nessa 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:

Padrão Factory em C# (Como funciona para desenvolvedores): Figura 3 - Saída em PDF do padrão de projeto Factory

Padrão Factory em C# (Como funciona para desenvolvedores): Figura 4 - Saída do método Factory básico

Conclusão

Padrão Factory em C# (Como funciona para desenvolvedores): Figura 5 - Licenciamento

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.

A IronPDF oferece um período de teste IronPDF para você começar, e as opções de licenciamento começam em liteLicense, atendendo a desenvolvedores que desejam integrar funcionalidades de PDF em seus aplicativos .NET .

Perguntas frequentes

Como o padrão Factory pode ser aplicado no desenvolvimento em C#?

O padrão Factory pode ser aplicado no desenvolvimento em C# através da criação de uma classe de fábrica que gerencia a instanciação de objetos. Essa abordagem permite que os desenvolvedores definam uma interface para a criação de um objeto, mas deixem que as subclasses alterem o tipo de objetos que serão criados, promovendo baixo acoplamento e flexibilidade do sistema.

Qual o papel do padrão Factory no design de software?

O padrão Factory desempenha um papel crucial no design de software, fornecendo uma maneira de delegar a instanciação de objetos a uma classe de fábrica. Isso ajuda a separar a lógica de criação da lógica de negócios, tornando o sistema mais gerenciável e fácil de estender.

Como os desenvolvedores podem usar o IronPDF para criar documentos PDF em C#?

Os desenvolvedores podem usar o IronPDF para criar documentos PDF em C# aproveitando seu mecanismo de renderização baseado no Chrome. Usando métodos como RenderHtmlAsPdf ou RenderUrlAsPdf , strings HTML ou páginas da web podem ser convertidas em documentos PDF de alta qualidade sem esforço.

Quais são os benefícios de usar uma biblioteca PDF .NET como o IronPDF?

Utilizar uma biblioteca .NET para PDF, como o IronPDF, oferece inúmeras vantagens, incluindo a capacidade de criar, editar e manipular PDFs a partir de diversas entradas, como HTML, CSS, imagens e JavaScript. Ele suporta operações assíncronas e ajuda a manter o layout e os estilos originais do conteúdo da web nos PDFs.

Como o padrão Factory pode aprimorar a geração de documentos PDF?

O padrão Factory aprimora a geração de documentos PDF, permitindo que os desenvolvedores definam uma interface comum para a criação de PDFs a partir de diferentes fontes, como strings HTML, URLs ou arquivos. Isso possibilita a adição de novos tipos de PDF sem alterar o código existente, em conformidade com o Princípio Aberto/Fechado.

Em que cenários o padrão Factory é mais útil?

O padrão Factory é mais útil em cenários onde um sistema precisa lidar com a criação de objetos dinamicamente, com base na entrada ou configuração do usuário. É particularmente benéfico em aplicações que requerem mudanças ou extensões frequentes no processo de criação de objetos.

Qual a importância do padrão Factory na manutenção da flexibilidade do software?

A importância do padrão Factory para manter a flexibilidade do software reside na sua capacidade de separar a criação de objetos da lógica de negócios. Isso permite que os desenvolvedores introduzam novos tipos de objetos sem modificar o código existente, mantendo assim uma arquitetura flexível e extensível.

Como o IronPDF suporta o padrão Factory na criação de documentos?

O IronPDF oferece suporte ao padrão Factory na criação de documentos, permitindo que os desenvolvedores implementem o padrão por meio de suas interfaces e métodos. Por exemplo, usando ChromePdfRenderer com diferentes tipos de entrada, os desenvolvedores podem criar vários formulários de documentos PDF sem alterar a lógica de criação subjacente.

Curtis Chau
Redator Técnico

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 ...

Leia mais

Equipe de suporte de ferro

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim