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

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

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
程式碼範例
為了說明 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
步驟 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
步驟 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
在此設定中,HtmlStringPdfCreator 和 UrlPdfCreator 是產生 PDF 的具體工廠。 Program 類別作為用戶端使用這些工廠,而不需要瞭解如何從 HTML 字串或 URL 產生 PDF 的複雜細節。 這種方法提供了靈活性,因為您只需增加實作 IPdfCreator 介面的工廠,就能依循物件導向設計的開放/封閉原則,引進新的 PDF 建立方式(例如,從檔案或串流建立 PDF)。
輸出
以下是程式碼輸出的截圖:


結論

C# 中的工廠模式提供了一個管理物件建立的框架,讓軟體設計更具維護性與擴充性。 透過使用具體的類別來實作抽象工廠和委託創建邏輯,開發人員可以建立更容易適應和擴充的系統。 無論是處理幾個類別或一個具有複雜依賴關係的系統,工廠模式都提供了一種結構化的方法來精確地建立類別物件。 這對於要建立的物件類型可能會根據使用者輸入、組態或應用程式狀態而有所不同的情境特別有利。
IronPDF 提供免費試用版,方便用戶入門,許可選項從 liteLicense 起,滿足希望將 PDF 功能整合到其 .NET 應用程式中的開發人員的需求。
常見問題解答
工廠模式如何在 C# 開發中應用?
工廠模式可以通過創建一個工廠類來進行物件的實例化管理來應用於 C# 開發。這種方法允許開發者為創建物件定義一個介面,但讓子類改變將創建的物件類型,促進鬆耦合和系統靈活性。
工廠模式在軟體設計中扮演什麼角色?
工廠模式在軟體設計中扮演著至關重要的角色,它提供了一種將物件實例化委託給工廠類的方法。這有助於將創建邏輯與業務邏輯分離,使系統更易於管理和擴展。
開發者如何使用 IronPDF 在 C# 中創建 PDF 文件?
開發者可以利用 IronPDF 的基於 Chrome 的渲染引擎在 C# 中創建 PDF 文件。通過使用 RenderHtmlAsPdf 或 RenderUrlAsPdf 等方法,可以輕鬆地將 HTML 字串或網頁轉換為高品質的 PDF 文件。
使用像 IronPDF 這樣的 .NET PDF 庫有什麼好處?
使用像 IronPDF 這樣的 .NET PDF 庫提供了多種好處,包括能夠從各種輸入如 HTML、CSS、圖像和 JavaScript 中創建、編輯和操作 PDF。它支持異步操作並幫助保持 PDF 中網頁內容的原始佈局和樣式。
工廠模式如何增強 PDF 文件的生成?
工廠模式通過允許開發者定義一個從不同來源創建 PDF 的通用介面來增強 PDF 文件的生成,例如 HTML 字串、URL 或文件。這樣可以在不改變現有代碼的情況下添加新的 PDF 類型,符合開放/封閉原則。
在什麼場景下工廠模式最有用?
工廠模式在系統需要根據用戶輸入或配置動態處理物件創建的場景中最有用。它對於那些需要頻繁更改或擴展物件創建過程的應用尤其有益。
工廠模式在維持軟體靈活性方面有何重要性?
工廠模式在維持軟體靈活性方面的重要性在於能夠將物件創建與業務邏輯分離。這允許開發者在不修改現有代碼的情況下引入新的物件類型,從而維持一個靈活和可擴展的架構。
IronPDF 如何在文檔創建中支持工廠模式?
IronPDF 支持開發者通過其介面和方法實施工廠模式。比如,使用 ChromePdfRenderer 及不同的輸入類型,開發者可以創建多樣的 PDF 文件形式而不改變底層創建邏輯。



