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

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への変換において優れており、原本のレイアウトやスタイルの正確な保持を確保しています。 レポート、請求書、およびドキュメントのような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: 具体的なファクトリーの実装

ここでは、2つの具体的なIPdfCreatorの実装を定義します:1つはHTML文字列からPDFを作成し、もう1つはURLから作成します。

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ドキュメント形式を作成し、基盤となる作成ロジックを変更することなしに仕様できます。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。