.NET 帮助

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

发布 2024年四月29日
分享:

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

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

基本工厂方法模式结构

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

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

示例:Vehicle Factory车辆工厂

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

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

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

代码示例

为了说明 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
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 提供一个免费试用 IronPDF许可证选项从 749 美元起,适合希望将 PDF 功能集成到其 .NET 应用程序中的开发人员。

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

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

免费NuGet下载 总下载量: 11,781,565 查看许可证 >