.NET 帮助

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

Kannaopat Udonpant
坎那帕·乌东攀
2024年四月29日
分享:

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

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

基本工厂方法模式结构

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

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

示例:Vehicle Factory车辆工厂

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

步骤 1:定义产品界面

public interface IVehicle
{
    void DisplayInfo();
}
public interface IVehicle
{
    void DisplayInfo();
}

步骤 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.");
    }
}

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

public abstract class VehicleFactory
{
    public abstract IVehicle CreateVehicle(string type);
}
public abstract class VehicleFactory
{
    public abstract IVehicle CreateVehicle(string type);
}

步骤 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");
        }
    }
}

步骤 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();
    }
}

在上例中,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 在以下方面表现出色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");
    }
}

代码示例

为了说明 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);
}

步骤 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");
    }
}

第 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");
    }
}

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

输出

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

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

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

结论

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

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

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

Kannaopat Udonpant
坎那帕·乌东攀
软件工程师
在成为软件工程师之前,Kannapat 从日本北海道大学完成了环境资源博士学位。在攻读学位期间,Kannapat 还成为了生物生产工程系车辆机器人实验室的成员。2022年,他利用自己的 C# 技能加入了 Iron Software 的工程团队,专注于 IronPDF。Kannapat 珍视他的工作,因为他能直接向编写 IronPDF 大部分代码的开发者学习。除了同伴学习,Kannapat 还享受在 Iron Software 工作的社交方面。不写代码或文档时,Kannapat 通常在 PS5 上玩游戏或重看《最后生还者》。
< 前一页
C#替换字符串中的字符(开发人员工作原理)
下一步 >
C# 四舍五入到小数点后两位(开发人员指南)