跳過到頁腳內容
.NET幫助

Factory Pattern C#(對於開發者的運行原理)

Factory Pattern in C# 是一種屬於設計模式類別的結構方法。 C# 中的工廠方法設計模式(Factory Method Design Pattern in C#)旨在解決在未指定將被創建的物件的確切創建者類別的情況下創建物件的相關問題。

基本上,工廠模式是透過委派特定的類別(稱為工廠類)來處理物件的建立。 這可讓系統更靈活、更容易管理,尤其是在引進新類型的物件時,因為工廠類別可處理物件的建立過程,減少對具體類別的依賴。 讓我們深入瞭解 C# 中的創作設計模式 Factory Method Pattern 如何實作與使用。 我們稍後會探討 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();
}
Public Interface IVehicle
	' Method to display information about the vehicle
	Sub DisplayInfo()
End Interface
$vbLabelText   $csharpLabel

步驟 2:執行具體產品

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.");
    }
}
Public Class Car
	Implements IVehicle

	' Displays Car specific information
	Public Sub DisplayInfo()
		Console.WriteLine("This is a Car.")
	End Sub
End Class

Public Class Truck
	Implements IVehicle

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

步驟 3:建立抽象的 Creator 類別

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);
}
Public MustInherit Class VehicleFactory
	' Factory Method to create a vehicle instance
	Public MustOverride Function CreateVehicle(ByVal type As String) As IVehicle
End Class
$vbLabelText   $csharpLabel

步驟 4:實作 Concrete Creator

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");
        }
    }
}
Public Class ConcreteVehicleFactory
	Inherits VehicleFactory

	Public Overrides Function CreateVehicle(ByVal type As String) As IVehicle
		' Create vehicle based on type
		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 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();
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Create factory instance
		Dim factory As VehicleFactory = New ConcreteVehicleFactory()

		' Create a Car and display its info
		Dim car As IVehicle = factory.CreateVehicle("car")
		car.DisplayInfo()

		' Create a Truck and display its info
		Dim truck As IVehicle = factory.CreateVehicle("truck")
		truck.DisplayInfo()
	End Sub
End Class
$vbLabelText   $csharpLabel

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

Factory Pattern C# (How It Works For Developers):圖 1 - 工廠設計模式輸出

使用工廠模式的優點

工廠模式具有多項優點,尤其是在複雜的系統中:

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

IronPDF:.NET PDF 解決方案

Factory Pattern C# (How It Works For Developers):圖 2 - IronPDF

IronPDF 是專為 .NET 平台設計的函式庫,可協助開發人員輕鬆建立、編輯和處理 直接從 HTML、CSS、影像和 JavaScript 製作的 PDF 檔案,而無需深入瞭解複雜的 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)
    {
        // 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");
    }
}
Imports IronPdf

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Initialize a Pdf Renderer with a Chrome Rendering Engine
		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 如何與工廠模式整合,讓我們建立一個簡化的範例。 工廠模式(Factory Pattern)是一種創建設計模式,提供一種在超類中創建具體產品或物件的方式,允許子類別修改所產生的特定物件。 這非常適合根據特定需求建立不同類型的 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);
}
Public Interface IPdfCreator
	' Method responsible for creating a PDF
	Sub CreatePdf(ByVal source As String)
End Interface
$vbLabelText   $csharpLabel

步驟 2:實作具體工廠

這裡我們定義了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");
    }
}
Public Class HtmlStringPdfCreator
	Implements IPdfCreator

	' Creates a PDF from an HTML string
	Public Sub CreatePdf(ByVal htmlString As String)
		Dim renderer = New ChromePdfRenderer()
		Dim pdf = renderer.RenderHtmlAsPdf(htmlString)
		pdf.SaveAs("HtmlStringPdf.pdf")
	End Sub
End Class

' Create PDF from a given URL
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)
    {
        // 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");
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Add your IronPDF license key
		License.LicenseKey = "License-Key"

		' Create PDF from HTML string
		Dim htmlPdfCreator As IPdfCreator = New HtmlStringPdfCreator()
		htmlPdfCreator.CreatePdf("<h1>Hello, World!</h1>")

		' Create PDF from URL
		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 建立方式(例如,從檔案或串流建立 PDF)。

輸出

以下是程式碼輸出的截圖:

Factory Pattern C# (How It Works For Developers):圖 3 - 工廠設計模式 PDF 輸出

Factory Pattern C# (How It Works For Developers):圖 4 - 基本工廠方法輸出

結論

Factory Pattern C# (How It Works For Developers):圖 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 中網頁內容的原始佈局和樣式。

工廠模式如何增強 PDF 文件的生成?

工廠模式通過允許開發者定義一個從不同來源創建 PDF 的通用介面來增強 PDF 文件的生成,例如 HTML 字串、URL 或文件。這樣可以在不改變現有代碼的情況下添加新的 PDF 類型,符合開放/封閉原則。

在什麼場景下工廠模式最有用?

工廠模式在系統需要根據用戶輸入或配置動態處理物件創建的場景中最有用。它對於那些需要頻繁更改或擴展物件創建過程的應用尤其有益。

工廠模式在維持軟體靈活性方面有何重要性?

工廠模式在維持軟體靈活性方面的重要性在於能夠將物件創建與業務邏輯分離。這允許開發者在不修改現有代碼的情況下引入新的物件類型,從而維持一個靈活和可擴展的架構。

IronPDF 如何在文檔創建中支持工廠模式?

IronPDF 支持開發者通過其介面和方法實施工廠模式。比如,使用 ChromePdfRenderer 及不同的輸入類型,開發者可以創建多樣的 PDF 文件形式而不改變底層創建邏輯。

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

Jacob Mellor是Iron Software的首席技術官,也是開創C# PDF技術的前瞻性工程師。作為Iron Software核心代碼庫的原始開發者,他自公司成立以來就塑造了公司的產品架構,並與CEO Cameron Rimington將公司轉型為服務NASA、Tesla以及全球政府機構的50多人公司。

Jacob擁有曼徹斯特大學土木工程一級榮譽學士學位(1998年–2001年)。他於1999年在倫敦開立首家軟體公司,並於2005年建立了他的第一個.NET組件,專注於解決Microsoft生態系統中的複雜問題。

他的旗艦作品IronPDF和Iron Suite .NET程式庫全球已獲得超過3000萬次NuGet安裝,他的基礎代碼不斷在全球各地驅動開發者工具。擁有25年以上的商業經驗和41年的編碼專業知識,Jacob仍然專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我