跳至頁尾內容
.NET 幫助

C# 工廠模式(開發者如何理解它)

C# 中的工廠模式是一種結構化方法,屬於設計模式的範疇。 C# 中的工廠方法設計模式旨在解決與建立物件相關的問題,而無需指定要建立物件的確切建立者類別。

本質上,工廠模式透過將物件創建委託給一個特定的類別(稱為工廠類別)來處理物件創建。 這使得系統更加靈活,也更容易管理,尤其是在引入新類型的物件時,因為工廠類別處理物件建立過程,從而減少了對特定類別的依賴。 讓我們深入了解 C# 中的創建型設計模式——工廠方法模式是如何實現和使用的。 我們稍後會探討IronPDF PDF 生成庫

基本工廠方法模式結構

工廠方法模式的核心思想是定義一個用於創建對象的通用接口,同時允許子類改變它們所創建對象的類型。 這種模式包含幾個關鍵組成部分:

-產品介面:指定工廠方法所建立的物件的結構。 -具體產品類別:實作產品介面。 -創建者類別(抽象類別 創建者):聲明工廠方法,該方法傳回產品介面的物件。 -混凝土創建器:修改工廠方法以交付混凝土產品的實例。

例如:汽車工廠

設想這樣一個場景:我們有不同類型的車輛,例如轎車和卡車。 我們將使用工廠模式建立一個車輛工廠,該工廠可以根據使用者輸入或設定檔建立不同類型的車輛。

步驟 1:定義產品接口

public interface IVehicle
{
    // Method to display information about the vehicle
    void DisplayInfo();
}
public interface IVehicle
{
    // Method to display information about the vehicle
    void DisplayInfo();
}
$vbLabelText   $csharpLabel

步驟二:實施混凝土製品

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

步驟 3:建立抽象建立器類

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

步驟 4:實現混凝土生成器

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

步驟 5:客戶端程式碼使用

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

在上面的範例中, VehicleFactory類別充當抽象創建者,而ConcreteVehicleFactory類別是實作工廠方法CreateVehicle 的特定創建者。 此方法根據接收到的輸入來決定要建立哪種類型的車輛。 然後,客戶端程式碼使用工廠創建不同車輛的實例,從而促進物件創建邏輯與客戶端程式碼之間的鬆散耦合。

C# 工廠模式(開發者如何理解):圖 1 - 工廠設計模式輸出

使用工廠模板的優勢

工廠模式具有許多優勢,尤其是在複雜系統中:

-松耦合:客戶端程式碼與介面或抽象類別交互,而不是與特定產品類別交互。 這樣一來,設計就更靈活,也更容易修改。 -可重複使用的物件導向軟體:工廠模式促進了程式碼的重用,因為它將物件創建邏輯與系統分離,使系統更容易維護和擴展。 -物件創建的靈活性:工廠方法允許使用不同的實現方式來創建對象,並且可以在運行時選擇使用哪種方式。這在所需物件類型可能因外部因素而異的場景中尤其有用。

IronPDF:.NET PDF 解決方案

C# 工廠模式(開發者如何理解):圖 2 - IronPDF

IronPDF 是一個專為 .NET 平台設計的程式庫,它可以幫助開發者直接從 HTML、CSS、圖像和 JavaScript 建立、編輯和操作 PDF 文件,而無需深入了解複雜的 PDF 生成 API。其主要優勢在於能夠快速、高精度地將 Web 內容轉換為 PDF 文檔,這得益於其基於 Chrome 的渲染引擎。

主要功能包括從 HTML 字串或 URL 產生 PDF、即時將網頁渲染為 PDF,以及能夠與表單應用程式、伺服器應用程式和安全內網等配合使用。 它的效能針對效率進行了最佳化,具備非同步操作、自訂日誌記錄功能,並提供豐富的文檔,幫助您快速上手。

IronPDF 在HTML 轉 PDF 方面表現出色,可確保精確保留原始佈局和樣式。 它非常適合從基於 Web 的內容(例如報告、發票和文件)建立 PDF。 IronPDF 支援 HTML 檔案、URL 和原始 HTML 字串,可以輕鬆產生高品質的 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");
    }
}
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");
    }
}
$vbLabelText   $csharpLabel

程式碼範例

為了說明 IronPDF 如何與工廠模式集成,讓我們建立一個簡化的範例。 工廠模式是一種創建型設計模式,它提供了一種在超類別中創建特定產品或物件的方法,允許子類別修改正在創建的特定物件。 這非常適合根據特定需求建立不同類型的 PDF 文檔,例如從 HTML 字串、URL 或文件建立文檔。

我們將創建一個名為IPdfCreator 的接口,該接口定義了一個用於創建 PDF 的方法,然後實現不同的工廠類,這些工廠類使用 IronPDF 以各種方式創建 PDF。

步驟 1:定義 IPdfCreator 介面

此介面聲明了所有特定工廠都將實現的CreatePdf方法。

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

第二步:實施混凝土工廠

這裡我們定義了IPdfCreator 的兩個具體實作:一個用於從 HTML 字串建立 PDF,另一個用於從 URL 建立 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 : 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");
    }
}
$vbLabelText   $csharpLabel

步驟 3:使用工廠

現在,您可以在應用程式中使用這些工廠從不同來源建立 PDF 文檔,而無需擔心 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");
    }
}
$vbLabelText   $csharpLabel

在此設定中, HtmlStringPdfCreatorUrlPdfCreator是產生 PDF 的具體工廠。 Program類別作為客戶端,使用這些工廠,而無需了解如何從 HTML 字串或 URL 產生 PDF 的複雜細節。 這種方法提供了靈活性,因為您可以按照物件導向設計的開放/封閉原則,透過添加更多實作IPdfCreator介面的工廠,引入建立 PDF 的新方法(例如,從檔案或流程建立)。

輸出

以下截圖為程式碼運行結果:

! C# 工廠模式(開發者如何理解):圖 3 - 工廠設計模式 PDF 輸出

C# 工廠模式(開發者如何理解):圖 4 - 基本工廠方法輸出

結論

C# 工廠模式(開發者如何理解):圖 5 - 許可

C# 中的工廠模式提供了一個用於管理物件創建的框架,使軟體設計更易於維護和擴展。 透過使用具體類別來實現抽象工廠並委託創建邏輯,開發人員可以創建更容易適應和擴展的系統。 無論是處理少量類別還是具有複雜依賴關係的系統,工廠模式都提供了一種結構化的方法來精確建立類別物件。 在需要建立的物件類型會根據使用者輸入、配置或應用程式狀態而變化的場景中,這種方法尤其有用。

IronPDF 提供免費試用版,方便用戶入門,授權選項從liteLicense開始,滿足希望將 PDF 功能整合到其 .NET 應用程式中的開發人員的需求。

常見問題解答

工廠模式如何在 C# 開發中應用?

在 C# 開發中,可以透過建立工廠類別來管理物件的實例化,從而應用工廠模式。這種方法允許開發人員定義一個用於創建物件的接口,但允許子類別修改所創建物件的類型,從而提高鬆散耦合性和系統靈活性。

工廠模式在軟體設計中扮演什麼角色?

工廠模式在軟體設計中扮演著至關重要的角色,它提供了一種將物件實例化委託給工廠類別的方法。這有助於將創建邏輯與業務邏輯分離,使系統更易於管理且更易於擴展。

開發人員如何使用 IronPDF 在 C# 中建立 PDF 文件?

開發者可以利用 IronPDF 基於 Chrome 的渲染引擎,用 C# 建立 PDF 文件。透過使用RenderHtmlAsPdfRenderUrlAsPdf等方法,可以輕鬆地將 HTML 字串或網頁轉換為高品質的 PDF 文件。

使用像 IronPDF 這樣的 .NET PDF 程式庫有哪些好處?

使用 IronPDF 等 .NET PDF 庫有很多好處,包括能夠從 HTML、CSS、圖像和 JavaScript 等各種輸入創建、編輯和操作 PDF。它支援非同步操作,並有助於在 PDF 中保持 Web 內容的原始佈局和樣式。

工廠模式如何提升PDF文檔產生效率?

工廠模式透過允許開發人員定義一個通用介面來增強 PDF 文件的生成,該介面可以從不同的來源(例如 HTML 字串、URL 或文件)建立 PDF。這使得無需更改現有程式碼即可新增新的 PDF 類型,從而遵循開閉原則。

工廠模式在哪些場景下最有用?

工廠模式最適用於系統需要根據使用者輸入或配置動態處理物件所建立的場景。它尤其適用於需要頻繁更改或擴展物件創建過程的應用程式。

工廠模式在維持軟體彈性方面有何意義?

工廠模式在保持軟體靈活性方面的重要性在於它能夠將物件創建與業務邏輯分開。這使得開發人員無需修改現有程式碼即可引入新的物件類型,從而保持架構的靈活性和可擴展性。

IronPDF 如何支援文件建立中的工廠模式?

IronPDF 支援文件建立中的工廠模式,讓開發者透過其介面和方法實現該模式。例如,使用ChromePdfRenderer和不同的輸入類型,開發者無需更改底層建立邏輯即可建立各種 PDF 文件表單。

Jacob Mellor,Team Iron 首席技術官
首席技術長

Jacob Mellor 是 Iron Software 的首席技術官,也是一位富有遠見的工程師,率先開發了 C# PDF 技術。作為 Iron Software 核心程式碼庫的最初開發者,他自公司成立之初便參與塑造了其產品架構,並與執行長 Cameron Rimington 一起將其發展成為一家擁有 50 多名員工、服務於 NASA、特斯拉和全球政府機構的公司。

Jacob 於 1998 年至 2001 年在曼徹斯特大學獲得土木工程一級榮譽學士學位。 1999 年,他在倫敦創辦了自己的第一家軟體公司;2005 年,他創建了自己的第一個 .NET 元件。此後,他專注於解決微軟生態系統中的複雜問題。

他的旗艦產品 IronPDF 和 IronSuite .NET 庫在全球 NuGet 上的安裝量已超過 3000 萬次,其基礎程式碼持續為全球開發者工具提供支援。憑藉 25 年的商業經驗和 41 年的程式設計專長,Jacob 始終致力於推動企業級 C#、Java 和 Python PDF 技術的創新,同時指導下一代技術領導者。