跳至頁尾內容
開發者更新

Factory Pattern 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();
}
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:建立抽象建立者類

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:實現具體建立者

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的具體建立者。 此方法根據接收到的輸入決定生成哪種型別的車輛。 然後客戶端程式碼使用工廠建立不同車輛的實例,促進了物件建立邏輯與客戶端程式碼之間的鬆耦合。

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

使用工廠模式的優勢

工廠模式提供了幾個優勢,特別是在複雜系統中:

  • 鬆耦合:客戶端程式碼與介面或抽象類交互,而不是具體產品類。 這導致設計更加靈活且易於修改。
  • 可重用的物件導向軟體:工廠模式促進程式碼重用,它將物件建立邏輯與系統分開,使系統更易於維護和擴展。
  • 物件建立的靈活性:工廠方法允許不同實現來建立物件,可以在運行時選擇使用,這在物件型別根據外部因素而變化的場景中尤其有用。

IronPDF:.NET PDF解決方案

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

IronPDF是一個專為.NET平台設計的程式庫,幫助開發者輕鬆從HTML、CSS、圖片和JavaScript直接建立、編輯和操作PDF文件,而不需要深入了解複雜的PDF生成API。其主要吸引力在於能夠快速且高精度地將網頁內容轉換為PDF文件,因為其使用了基於Chrome的渲染引擎。

其主要特點包括從HTML字串或URL生成PDF、將網頁即時渲染為PDF,並能夠與視窗應用程式、伺服器應用程式和安全內聯網等一起工作。 其性能對於效率進行了優化,具有非同步操作、自訂記錄和豐富的文件以幫助您快速入門。

IronPDF在HTML到PDF的轉換中表現出色,確保精確保留原始佈局和樣式。 它非常適合從基於網路的內容(如報告、發票和文件)建立PDF文件。 用於HTML文件、URL和原始HTML字串的支持,IronPDF可以輕鬆生成高品質的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如何與工廠模式整合,我們來建立一個簡化的例子。 工廠模式是一種建立型設計模式,提供了一種在超類中建立具體產品或物件的方法,允許子類修改正在生產的具體物件。 這與根據具體需求建立不同型別的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類充當客戶端,使用這些工廠而無需知道PDF是如何從HTML字串或URL生成的複雜細節。 這種方法提供了靈活性,因為您可以通過新增實現了IPdfCreator介面的更多工廠引入新的PDF建立方式(例如,從文件或流中),遵循物件導向設計的開放/封閉原則。

輸出

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

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

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

結論

工廠模式 C#(開發者如何運作):圖5 - 授權

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

IronPDF提供IronPDF的免費試用以便開始,許可選項從liteLicense開始,適合尋求在其.NET應用程式中整合PDF功能的開發者。

常見問題

如何在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文件生成,允許開發者定義從不同來源(如HTML字串、URL或文件)建立PDF的通用介面。這允許在不更改現有程式碼的情況下新增新的PDF型別,遵循開閉原則。

工廠模式在哪些情境最有用?

工廠模式在需要根據使用者輸入或配置動態處理物件建立的情境中最有用。它特別適合需要經常更改或擴展物件建立過程的應用程式。

工廠模式在維持軟體靈活性方面的意義是什麼?

工廠模式在維持軟體靈活性方面的意義在於能夠將物件建立與業務邏輯分開。這允許開發者在不修改現有程式碼的情況下引入新的物件型別,從而維持靈活且可擴展的架構。

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

IronPDF通過其介面和方法支持文件建立中的工廠模式。例如,使用ChromePdfRenderer與不同的輸入型別,開發者可以在不更改底層建立邏輯的情況下建立各種PDF文件形式。

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

Jacob Mellor是Iron Software的首席技術官,一位在C# PDF技術上開創先河的遠見工程師。作為Iron Software核心程式碼庫的原開發者,他從創立以來就一直在塑造公司的產品架構,與首席執行官Cameron Rimington一起將公司轉變為服務於NASA、特斯拉和全球政府公司的50多名人員的公司。

Jacob擁有曼徹斯特大學的土木工程一等榮譽學士學位(BEng),於1998-2001年之間獲得。在1999年於倫敦創辦他的第一家軟體公司並於2005年建立了他的第一批.NET元組件後,他專注於解決Microsoft生態系統中的複雜問題。

他的旗艦IronPDF和Iron Suite .NET程式庫在全球獲得了超過3000萬次NuGet安裝依據,他的基礎程式碼基繼續支援著世界各地開發者使用的工具。擁有25年的商業經驗和41年的程式設計專業知識,他仍專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron 支援團隊

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