.NET 帮助

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

发布 2024年四月29日
分享:

"(《世界人权宣言》) C# 中的工厂模式 是一种结构方法,属于设计模式的范畴。C# 中的工厂方法设计模式旨在解决与创建对象相关的问题,而无需指定将要创建对象的确切创建者类。

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

基本工厂方法模式结构

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

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

示例:车辆工厂

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

步骤 1:定义产品界面

public interface IVehicle
{
    void DisplayInfo();
}
public interface IVehicle
{
    void DisplayInfo();
}
Public Interface IVehicle
	Sub DisplayInfo()
End Interface
VB   C#

步骤 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
VB   C#

步骤 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
VB   C#

步骤 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
VB   C#

步骤 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
VB   C#

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

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

使用工厂模式的优势

工厂模式有几个优点,尤其是在复杂系统中:

  • 松耦合:客户端代码与接口或抽象类交互,而不是与具体的产品类交互。这样的设计更加灵活,也更容易修改。
  • 可重用的面向对象软件:工厂模式将对象创建逻辑从系统中分离出来,使系统更易于维护和扩展,从而促进了代码的重复使用。

  • 对象创建的灵活性:工厂方法允许在运行时选择创建对象的不同实现方式。在需要的对象类型会因外部因素而变化的情况下,这一点尤其有用。

IronPDF:.NET PDF 解决方案

工厂模式 C#(如何为开发人员工作):图 2 - IronPDF

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

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

代码示例

为了说明 IronPDF 如何与工厂模式集成,让我们创建一个简化的示例。工厂模式(Factory Pattern)是一种创建设计模式,它提供了一种在超类中创建具体产品或对象的方法,允许子类修改正在生成的特定对象。这非常适合根据特定需求创建不同类型的 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
VB   C#

步骤 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
VB   C#

第 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
VB   C#

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

输出

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

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

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

结论

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

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

IronPDF 提供了 免费试用 许可证选项从 749 美元起,适合希望将 PDF 功能集成到其 .NET 应用程序中的开发人员。

< 前一页
C#替换字符串中的字符(开发人员工作原理)
下一步 >
C# 四舍五入到小数点后两位(开发人员指南)

准备开始了吗? 版本: 2024.9 刚刚发布

免费NuGet下载 总下载量: 10,731,156 查看许可证 >