フッターコンテンツにスキップ
.NETヘルプ

Factory Pattern C#(開発者向けの動作方法)

C#におけるファクトリパターンは、デザインパターンのカテゴリに属する構造的アプローチです。 C#でのファクトリメソッドデザインパターンは、作成されるオブジェクトの正確な生成クラスを指定せずにオブジェクトを作成する問題を解決することを目的としています。

基本的に、ファクトリパターンはオブジェクトの作成を特定のクラス(ファクトリクラスと呼ばれる)に委任することで対処します。 これにより、システムをより柔軟で管理しやすくすることができ、新しいタイプのオブジェクトを導入する際に特に有用です。ファクトリクラスがオブジェクト作成プロセスを管理し、具体的なクラスへの依存を減らします。 C#での生成的デザインパターンであるファクトリメソッドパターンをどのように実装して使用できるかを探ってみましょう。 後ほど、IronPDF PDF生成ライブラリを探っていきます。

基本的なファクトリメソッドパターンの構造

ファクトリメソッドパターンの核心となるアイディアは、オブジェクトを作成するための共通のインターフェースを定義しながら、サブクラスが作成するオブジェクトのタイプを変更できるようにすることです。 このパターンはいくつかの主要なコンポーネントを含みます:

-製品インターフェイス:ファクトリ メソッドによって作成されたオブジェクトの構造を指定します。 -具体的な製品クラス:製品インターフェースを実装します。

  • Creator クラス (抽象クラス Creator):製品インターフェイスのオブジェクトを返すファクトリ メソッドを宣言します。
  • Concrete Creator:具体的な製品のインスタンスを提供するファクトリ メソッドを変更します。

例:車両ファクトリ

車やトラックのような異なるタイプの車両があるシナリオを考えてみましょう。 ユーザー入力または構成ファイルに基づいて異なる種類の車両を作成できる車両ファクトリを作成するためにファクトリパターンを使用します。

ステップ 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プラットフォーム用に設計されたライブラリで、開発者が複雑なPDF生成APIに深く入り込むことなく、HTML、CSS、画像、およびJavaScriptから直接PDFファイルを簡単に作成、編集、操作できるようにします。主な魅力は、Chromeベースのレンダリングエンジンを使用して、ウェブコンテンツを迅速かつ高精度でPDF文書に変換できることです。

主な機能には、HTML文字列またはURLからのPDFの生成、ウェブページの動的なPDFへのレンダリング、フォームアプリケーション、サーバーアプリケーション、そして安全なイントラネットなどとの連携があります。 そのパフォーマンスは効率のために最適化されており、非同期操作、カスタムロギング、および迅速に開始するための豊富なドキュメンテーションを提供しています。

IronPDF は HTML から PDF への変換に秀でており、元のレイアウトとスタイルを正確に保存します。 これは、レポート、請求書、ドキュメントなどの Web ベースのコンテンツから 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をファクトリパターンと統合する方法を示すために、簡単な例を作成してみましょう。 ファクトリパターンは、スーパークラス内で具体的なプロダクトやオブジェクトを作成する方法を提供するタイプの生成的デザインパターンであり、サブクラスが生産される特定のオブジェクトを修正することを許可します。 これは、特定のニーズに基づいてHTML文字列、URL、ファイルから異なるタイプのPDFドキュメントを作成することに適しています。

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 の具体的な実装を 2 つ定義します。1つは HTML 文字列から PDF を作成するためのもので、もう 1 つは 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を生成する詳細を知る必要なく、これらのファクトリーを使用します。 このアプローチは柔軟性を提供し、ファイルやストリームなどからの新しいPDF作成方法を導入することが可能で、IPdfCreatorインターフェースを実装するファクトリーを追加することで、オープン/クローズドの原則を守ります。

出力

以下のスクリーンショットはコードの出力です:

ファクトリーパターン C# (開発者向けの仕組み): 図 3 - ファクトリー設計パターン PDF 出力

ファクトリー パターン C# (開発者向けの仕組み): 図 4 - 基本ファクトリー メソッドの出力

結論

ファクトリーパターン C# (開発者向けの仕組み): 図 5 - ライセンス

C#のファクトリパターンは、オブジェクト作成を管理し、ソフトウェアデザインをよりメンテナンス可能で拡張可能にするためのフレームワークを提供します。 具体クラスを使用して抽象ファクトリを実装し、作成ロジックを委任することで、開発者は変更しやすく拡張しやすいシステムを作成することができます。 少数のクラスを扱う場合でも、複雑な依存関係のあるシステムの場合でも、ファクトリパターンは具体的なクラスオブジェクトの作成に対する構造化アプローチを提供します。 特に、ユーザー入力、構成、またはアプリケーションの状態に基づいて作成されるオブジェクトのタイプが異なる場合に便利です。

IronPDF、始めるためにIronPDFの無料トライアルを提供しており、ライセンス オプションは liteLicense から始まり、PDF 機能を.NETアプリケーションに統合したいと考えている開発者のニーズに応えています。

よくある質問

C#開発においてファクトリーパターンはどのように適用できますか?

ファクトリーパターンは、オブジェクトのインスタンス化を管理するファクトリクラスを作成することでC#開発に適用できます。このアプローチにより、オブジェクトの作成インターフェースを定義しつつ、サブクラスが作成されるオブジェクトのタイプを変更できるため、結合度を低くしシステムの柔軟性を促進します。

ソフトウェアデザインにおいてファクトリーパターンはどのような役割を果たしますか?

ファクトリーパターンは、オブジェクトのインスタンス化をファクトリクラスに委ねる方法を提供することで、ソフトウェアデザインにおける重要な役割を果たします。これにより、作成ロジックとビジネスロジックを分離し、システムをより管理しやすく、拡張しやすくします。

C#でPDFドキュメントを作成するために開発者はIronPDFをどのように使用できますか?

開発者はChromeベースのレンダリングエンジンを活用してC#でPDFドキュメントを作成するためにIronPDFを使用できます。RenderHtmlAsPdfまたはRenderUrlAsPdfのようなメソッドを使用することで、HTML文字列やウェブページを高品質のPDFドキュメントに簡単に変換できます。

.NET PDFライブラリであるIronPDFを使用する利点は何ですか?

.NET PDFライブラリであるIronPDFを使用することにより、HTML、CSS、画像、JavaScriptのようなさまざまな入力からPDFを作成、編集、操作することができるなど、数多くの利点があります。非同期操作をサポートしており、PDF内のウェブコンテンツのオリジナルのレイアウトとスタイルを維持するのに役立ちます。

ファクトリーパターンによってPDFドキュメントの生成はどのように向上しますか?

ファクトリーパターンによって、さまざまなソース(HTML文字列、URL、ファイルなど)から共通のインターフェースを介してPDFを作成することが可能になります。これにより、既存のコードを変更することなく、新しいPDFタイプを追加することができ、オープン/クローズド原則に従っています。

ファクトリーパターンはどのようなシナリオで最も役立ちますか?

ファクトリーパターンは、ユーザー入力や設定に基づいて動的にオブジェクトの作成を処理する必要があるシステムで最も役立ちます。特に、オブジェクトの作成プロセスに頻繁な変更や拡張が必要なアプリケーションで有益です。

ソフトウェアの柔軟性を維持するためにファクトリーパターンの重要性はどこにありますか?

ソフトウェアの柔軟性を維持するためにファクトリーパターンの重要性は、ビジネスロジックからオブジェクトの作成を分離する能力にあります。これにより、既存のコードを変更することなく新しいオブジェクトタイプを導入でき、柔軟で拡張可能なアーキテクチャを維持します。

IronPDFはPDF作成時にファクトリーパターンをどのようにサポートしますか?

IronPDFはそのインターフェースとメソッドを通じてパターンを実装することにより、PDF作成時のファクトリーパターンをサポートします。例えば、異なる入力タイプでChromePdfRendererを使用して、開発者は異なるPDFドキュメント形式を作成し、基盤となる作成ロジックを変更することなしに仕様できます。

Jacob Mellor、Ironチームの最高技術責任者(CTO)
最高技術責任者(CTO)

ジェイコブ・メラーはIron Softwareの最高技術責任者(CTO)であり、C# PDFテクノロジーを開拓する先見的なエンジニアです。Iron Softwareのコアコードベースを支えるオリジナル開発者として、彼は創業以来、会社の製品アーキテクチャを形成し、CEOのCameron Rimingtonとともに、会社をNASA、Tesla、および世界的な政府機関にサービスを提供する50人以上の会社に変えました。1999年にロンドンで最初のソフトウェアビジネスを開業し、2005年に最初 for .NETコンポーネントを作成した後、Microsoftのエコシステム全体で複雑な問題を解決することを専門としました。

彼の主要なIronPDFとIron Suite .NETライブラリは、世界中で3000万以上のNuGetインストールを達成し、彼の基礎となるコードは世界中で使用されている開発者ツールに力を与え続けています。25年の商業経験と41年のコーディングの専門知識を持つJacobは、次世代の技術リーダーを指導しながら、エンタープライズグレードのC#、Java、Python PDFテクノロジーにおけるイノベーションの推進に注力しています。

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね