.NET 帮助

工厂模式C#(开发者如何使用)

C# 中的工厂模式是一种结构性方法,属于设计模式类别。 工厂方法设计模式在C#中旨在解决与创建对象相关的问题,而无需指定将要创建的对象的确切创建者类。

从本质上讲,工厂模式是将对象创建委托给一个特定的类,即工厂类。 工厂类可以处理对象的创建过程,减少对具体类的依赖,从而使系统更灵活、更易于管理,尤其是在引入新类型对象时。 让我们深入了解工厂方法模式这种 C# 中的创建设计模式如何实现和使用。 我们稍后将探索 IronPDF PDF 生成库

基本工厂方法模式结构

工厂方法模式背后的核心思想是定义一个用于创建对象的通用接口,同时允许子类改变所创建对象的类型。 该模式涉及几个关键部分:抽象工厂模式、创建设计模式、工厂设计模式、现有代码、基本工厂模式、抽象工厂模式、实际示例、具体产品、相关或依赖对象以及具体类。

  • 产品接口:指定由工厂方法创建的对象的结构。
  • 具体产品类:实现产品接口。
  • Creator 类(抽象类 Creator):声明工厂方法,该方法返回产品接口的对象。
  • 具体创建者:修改工厂方法以提供具体产品的实例。

示例:Vehicle Factory车辆工厂

假设我们有不同类型的汽车,如轿车和卡车。 我们将使用工厂模式创建一个车辆工厂,它可以根据用户输入或配置文件创建不同类型的车辆。

步骤 1:定义产品界面

public interface IVehicle
{
    void DisplayInfo();
}
public interface IVehicle
{
    void DisplayInfo();
}
Public Interface IVehicle
	Sub DisplayInfo()
End Interface
$vbLabelText   $csharpLabel

步骤 2:实施混凝土产品

public class Car : IVehicle
{
    public void DisplayInfo()
    {
        Console.WriteLine("This is a Car.");
    }
}
public class Truck : IVehicle
{
    public void DisplayInfo()
    {
        Console.WriteLine("This is a Truck.");
    }
}
public class Car : IVehicle
{
    public void DisplayInfo()
    {
        Console.WriteLine("This is a Car.");
    }
}
public class Truck : IVehicle
{
    public void DisplayInfo()
    {
        Console.WriteLine("This is a Truck.");
    }
}
Public Class Car
	Implements IVehicle

	Public Sub DisplayInfo()
		Console.WriteLine("This is a Car.")
	End Sub
End Class
Public Class Truck
	Implements IVehicle

	Public Sub DisplayInfo()
		Console.WriteLine("This is a Truck.")
	End Sub
End Class
$vbLabelText   $csharpLabel

步骤 3:创建抽象创建器类

public abstract class VehicleFactory
{
    public abstract IVehicle CreateVehicle(string type);
}
public abstract class VehicleFactory
{
    public abstract IVehicle CreateVehicle(string type);
}
Public MustInherit Class VehicleFactory
	Public MustOverride Function CreateVehicle(ByVal type As String) As IVehicle
End Class
$vbLabelText   $csharpLabel

步骤 4:实施具体创建器

public class ConcreteVehicleFactory : VehicleFactory
{
    public override IVehicle CreateVehicle(string 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)
    {
        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
		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

步骤 5:客户端代码使用

class Program
{
    static void Main(string [] args)
    {
        // create objects
        VehicleFactory factory = new ConcreteVehicleFactory();
        IVehicle car = factory.CreateVehicle("car");
        car.DisplayInfo();
        IVehicle truck = factory.CreateVehicle("truck");
        truck.DisplayInfo();
    }
}
class Program
{
    static void Main(string [] args)
    {
        // create objects
        VehicleFactory factory = new ConcreteVehicleFactory();
        IVehicle car = factory.CreateVehicle("car");
        car.DisplayInfo();
        IVehicle truck = factory.CreateVehicle("truck");
        truck.DisplayInfo();
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' create objects
		Dim factory As VehicleFactory = New ConcreteVehicleFactory()
		Dim car As IVehicle = factory.CreateVehicle("car")
		car.DisplayInfo()
		Dim truck As IVehicle = factory.CreateVehicle("truck")
		truck.DisplayInfo()
	End Sub
End Class
$vbLabelText   $csharpLabel

在上述示例中,VehicleFactory 类用作抽象创建者,其中 ConcreteVehicleFactory 类是实现工厂方法 CreateVehicle 的具体创建者。 该方法根据收到的输入决定创建哪种类型的车辆。 然后,客户端代码使用工厂创建不同车辆的实例,从而促进对象创建逻辑与客户端代码之间的松耦合。

工厂模式 C# (开发人员如何使用): 图 1 - 工厂设计模式输出

使用工厂模式的优势

工厂模式具有多种优势,尤其是在复杂系统中:

  • 松耦合:客户端代码与接口或抽象类进行交互,而不是与具体产品类交互。 这样的设计更加灵活,也更容易修改。
  • 可重用的面向对象软件:工厂模式通过将对象创建逻辑与系统分离,促进了代码的重用,使系统更易于维护和扩展。
  • 对象创建的灵活性:工厂方法允许为创建对象提供不同的实现,能够在运行时进行选择。这在需求对象类型可以根据外部因素变化的场景中特别有用。

IronPDF: .NET PDF 解决方案

工厂模式 C#(对开发者的作用):图 2 - IronPDF

IronPDF 是为 .NET 平台设计的一个库,帮助开发人员轻松地通过 HTML、CSS、图像和 JavaScript 直接创建、编辑和操作 PDF 文件,而无需深入研究复杂的 PDF 生成 API。其主要吸引力在于能够快速且高精确度地将网页内容转换为 PDF 文档,这得益于它使用的基于 Chrome 的渲染引擎。

主要功能包括从 HTML 字符串或 URL 生成 PDF、将网页即时渲染为 PDF,以及与表单应用程序、服务器应用程序和安全内联网等协同工作的能力。 它的性能经过优化,具有异步操作、自定义日志和大量文档等功能,可帮助您快速上手,提高效率。

IronPDF 在HTML 转 PDF转换方面表现出色,确保原始布局和样式的精确保留。 它非常适合从基于网络的内容(如报告、发票和文档)创建PDF。 IronPDF 支持 HTML 文件、URL 和原始 HTML 字符串,能够轻松生成高质量的 PDF 文档。

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        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)
    {
        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)
		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

代码示例

为了说明 IronPdf 如何与工厂模式集成,让我们创建一个简化的示例。 工厂模式是一种创建设计模式,它提供了一种在超类中创建具体产品或对象的方法,允许子类修改正在生成的特定对象。 这非常适合根据特定需求创建不同类型的 PDF 文档,例如从 HTML 字符串、URL 或文件创建 PDF 文档。

我们将创建一个名为IPdfCreator的接口,该接口定义了一个用于创建PDF的方法,然后实现不同的工厂类,这些工厂类使用IronPDF以各种方式创建PDF。

步骤 1:定义 IPdfCreator 界面

此接口声明了所有具体工厂将实现的CreatePdf方法。

public interface IPdfCreator
{
    void CreatePdf(string source);
}
public interface IPdfCreator
{
    void CreatePdf(string source);
}
Public Interface IPdfCreator
	Sub CreatePdf(ByVal source As String)
End Interface
$vbLabelText   $csharpLabel

步骤 2:实施混凝土工厂

在这里,我们定义了两个IPdfCreator的具体实现:一个用于从HTML字符串创建PDF,另一个用于从URL创建PDF。

// public class
public class HtmlStringPdfCreator : IPdfCreator
{
    public void CreatePdf(string htmlString)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(htmlString);
        pdf.SaveAs("HtmlStringPdf.pdf");
    }
}
public class UrlPdfCreator : IPdfCreator
{
    public void CreatePdf(string url)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf(url);
        pdf.SaveAs("UrlPdf.pdf");
    }
}
// public class
public class HtmlStringPdfCreator : IPdfCreator
{
    public void CreatePdf(string htmlString)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(htmlString);
        pdf.SaveAs("HtmlStringPdf.pdf");
    }
}
public class UrlPdfCreator : IPdfCreator
{
    public void CreatePdf(string url)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf(url);
        pdf.SaveAs("UrlPdf.pdf");
    }
}
' public class
Public Class HtmlStringPdfCreator
	Implements IPdfCreator

	Public Sub CreatePdf(ByVal htmlString As String)
		Dim renderer = New ChromePdfRenderer()
		Dim pdf = renderer.RenderHtmlAsPdf(htmlString)
		pdf.SaveAs("HtmlStringPdf.pdf")
	End Sub
End Class
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

第 3 步:使用工厂

在您的应用程序中,您现在可以使用这些工厂从不同来源创建 PDF 文档,而无需担心 PDF 创建过程的细节。

class Program
{
    static void Main(string [] args)
    {
    License.LicenseKey = "License-Key";
        IPdfCreator htmlPdfCreator = new HtmlStringPdfCreator();
        htmlPdfCreator.CreatePdf("<h1>Hello, World!</h1>");
        IPdfCreator urlPdfCreator = new UrlPdfCreator();
        urlPdfCreator.CreatePdf("http://example.com");
    }
}
class Program
{
    static void Main(string [] args)
    {
    License.LicenseKey = "License-Key";
        IPdfCreator htmlPdfCreator = new HtmlStringPdfCreator();
        htmlPdfCreator.CreatePdf("<h1>Hello, World!</h1>");
        IPdfCreator urlPdfCreator = new UrlPdfCreator();
        urlPdfCreator.CreatePdf("http://example.com");
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
	License.LicenseKey = "License-Key"
		Dim htmlPdfCreator As IPdfCreator = New HtmlStringPdfCreator()
		htmlPdfCreator.CreatePdf("<h1>Hello, World!</h1>")
		Dim urlPdfCreator As IPdfCreator = New UrlPdfCreator()
		urlPdfCreator.CreatePdf("http://example.com")
	End Sub
End Class
$vbLabelText   $csharpLabel

在此设置中,HtmlStringPdfCreatorUrlPdfCreator 是用于生成 PDF 的具体工厂。 Program 类作为客户端使用这些工厂,而无需了解如何从 HTML 字符串或 URL 生成 PDF 的复杂细节。 这种方法提供了灵活性,因为您可以通过添加更多实现IPdfCreator接口的工厂来引入创建PDF的新方式(例如,从文件或流创建),这遵循了面向对象设计的开放/封闭原则。

输出

以下截图是代码的输出结果:

工厂模式 C#(开发人员如何工作):图 3 - 工厂设计模式 PDF 输出

工厂模式 C#(它如何为开发人员工作):图 4 - 基础工厂方法输出

结论

工厂模式 C#(如何为开发人员工作):图 5 - 许可

C# 中的工厂模式提供了一个管理对象创建的框架,使软件设计更具可维护性和可扩展性。 通过使用具体类来实现抽象工厂和委托创建逻辑,开发人员可以创建更易于调整和扩展的系统。 无论是处理少数几个类,还是处理具有复杂依赖关系的系统,工厂模式都提供了一种精确创建类对象的结构化方法。 在根据用户输入、配置或应用程序状态创建的对象类型可能会有所不同的情况下,翻译工作尤为重要。

IronPDF提供IronPDF的免费试用以便开始使用,许可证选项从$749起,以满足希望将PDF功能集成到其.NET应用程序中的开发人员的需求。

Chipego
软件工程师
Chipego 拥有出色的倾听技巧,这帮助他理解客户问题并提供智能解决方案。他在 2023 年加入 Iron Software 团队,此前他获得了信息技术学士学位。IronPDF 和 IronOCR 是 Chipego 主要专注的两个产品,但他对所有产品的了解每天都在增长,因为他不断找到支持客户的新方法。他喜欢 Iron Software 的合作氛围,公司各地的团队成员贡献他们丰富的经验,以提供有效的创新解决方案。当 Chipego 离开办公桌时,你经常可以发现他在看书或踢足球。
< 前一页
C#替换字符串中的字符(开发人员工作原理)
下一步 >
C# 四舍五入到小数点后两位(开发人员指南)