.NET ヘルプ

ファクトリーパターン C#(開発者向けの仕組み)

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

基本的に、ファクトリーパターンは、ファクトリークラスとして知られる特定のクラスに委譲することで、オブジェクトの作成を扱います。 これは、ファクトリークラスがオブジェクトの作成プロセスを処理するため、システムがより柔軟で管理しやすくなり、特に新しい種類のオブジェクトを導入する際に具体的なクラスへの依存が減少するようにします。 C#の生成設計パターンであるファクトリーメソッドパターンの実装と使用方法について掘り下げてみましょう。 後でIronPDF PDF Generation Libraryについて探求します。

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

ファクトリーメソッドパターンの核心となるアイデアは、オブジェクトを作成するための共通インターフェースを定義し、サブクラスが作成するオブジェクトのタイプを変更できるようにすることです。 このパターンにはいくつかの主要な要素が含まれます:アブストラクトファクトリパターン、生成に関するデザインパターン、ファクトリデザインパターン、既存のコード、基本的なファクトリパターン、アブストラクトファクトリパターン、実際の例、具体的なプロダクト、関連または依存するオブジェクト、具体的なクラス。

  • 製品インターフェース: ファクトリーメソッドによって作成されるオブジェクトの構造を指定します。
  • 具体的な製品クラス: 製品インターフェースを実装する。
  • Creatorクラス(抽象クラスCreator): 製品インターフェイスのオブジェクトを返すファクトリーメソッドを宣言します。
  • 具体的作成者: 具象製品のインスタンスを提供するためにファクトリーメソッドを修正します。

例:ビークルファクトリー

車やトラックなど、さまざまな種類の車両があるシナリオを考えてみてください。 ファクトリーパターンを使用して、ユーザーの入力や設定ファイルに基づいて異なる種類の車両を作成できる車両ファクトリを作成します。

ステップ1:製品インターフェイスを定義する

public interface IVehicle
{
    void DisplayInfo();
}
public interface IVehicle
{
    void DisplayInfo();
}
Public Interface IVehicle
	Sub DisplayInfo()
End Interface
$vbLabelText   $csharpLabel

ステップ2: Concrete Productsを実装する

public class Car : IVehicle
{
    public void DisplayInfo()
    {
        Console.WriteLine("This is a Car.");
    }
}
public class Truck : IVehicle
{
    public void DisplayInfo()
    {
        Console.WriteLine("This is a Truck.");
    }
}
public class Car : IVehicle
{
    public void DisplayInfo()
    {
        Console.WriteLine("This is a Car.");
    }
}
public class Truck : IVehicle
{
    public void DisplayInfo()
    {
        Console.WriteLine("This is a Truck.");
    }
}
Public Class Car
	Implements IVehicle

	Public Sub DisplayInfo()
		Console.WriteLine("This is a Car.")
	End Sub
End Class
Public Class Truck
	Implements IVehicle

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

ステップ3: 抽象アーキテクタクラスを作成する

public abstract class VehicleFactory
{
    public abstract IVehicle CreateVehicle(string type);
}
public abstract class VehicleFactory
{
    public abstract IVehicle CreateVehicle(string type);
}
Public MustInherit Class VehicleFactory
	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)
    {
        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)
    {
        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
		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 objects
        VehicleFactory factory = new ConcreteVehicleFactory();
        IVehicle car = factory.CreateVehicle("car");
        car.DisplayInfo();
        IVehicle truck = factory.CreateVehicle("truck");
        truck.DisplayInfo();
    }
}
class Program
{
    static void Main(string [] args)
    {
        // create objects
        VehicleFactory factory = new ConcreteVehicleFactory();
        IVehicle car = factory.CreateVehicle("car");
        car.DisplayInfo();
        IVehicle truck = factory.CreateVehicle("truck");
        truck.DisplayInfo();
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' create objects
		Dim factory As VehicleFactory = New ConcreteVehicleFactory()
		Dim car As IVehicle = factory.CreateVehicle("car")
		car.DisplayInfo()
		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を使わずに済むようになっています。その最大の魅力は、Chromeベースのレンダリングエンジンを使用することで、ウェブコンテンツを素早く高精度にPDFドキュメントに変換できる点にあります。

主な機能には、HTML文字列やURLからPDFを生成すること、ウェブページを即座にPDFとしてレンダリングすること、そしてフォームアプリケーション、サーバーアプリケーション、安全なイントラネットなどと連携する能力が含まれます。 そのパフォーマンスは効率を最適化しており、非同期操作、カスタムログ記録、迅速に始めるための詳細なドキュメントなどの機能を備えています。

IronPDFは、元のレイアウトとスタイルを正確に保持してHTMLからPDFへの変換に優れています。 それは、レポート、請求書、およびドキュメントなどのWebベースのコンテンツからPDFを作成するのに最適です。 IronPDFはHTMLファイル、URL、生のHTML文字列をサポートしており、簡単に高品質なPDFドキュメントを生成します。

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        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)
    {
        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)
		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パターンと統合する方法を説明するために、簡単な例を作成しましょう。 ファクトリーパターンは、具体的な製品やオブジェクトをスーパークラス内で作成する方法を提供し、サブクラスが生成される特定のオブジェクトを変更できるようにする生成デザインパターンの一種です。 これは、HTML文字列、URL、またはファイルから特定のニーズに基づいてさまざまな種類のPDF文書を作成するのに適しています。

私たちは、PDFを作成するためのメソッドを定義するIPdfCreatorというインターフェースを作成し、その後、IronPDFを使用して様々な方法でPDFを作成する異なるファクトリークラスを実装します。

ステップ1: IPdfCreatorインターフェースを定義する

このインターフェースは、すべての具体的なファクトリーが実装するCreatePdfメソッドを宣言します。

public interface IPdfCreator
{
    void CreatePdf(string source);
}
public interface IPdfCreator
{
    void CreatePdf(string source);
}
Public Interface IPdfCreator
	Sub CreatePdf(ByVal source As String)
End Interface
$vbLabelText   $csharpLabel

ステップ2:具体的なファクトリーを実装する

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

// public class
public class HtmlStringPdfCreator : IPdfCreator
{
    public void CreatePdf(string htmlString)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(htmlString);
        pdf.SaveAs("HtmlStringPdf.pdf");
    }
}
public class UrlPdfCreator : IPdfCreator
{
    public void CreatePdf(string url)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf(url);
        pdf.SaveAs("UrlPdf.pdf");
    }
}
// public class
public class HtmlStringPdfCreator : IPdfCreator
{
    public void CreatePdf(string htmlString)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(htmlString);
        pdf.SaveAs("HtmlStringPdf.pdf");
    }
}
public class UrlPdfCreator : IPdfCreator
{
    public void CreatePdf(string url)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf(url);
        pdf.SaveAs("UrlPdf.pdf");
    }
}
' public class
Public Class HtmlStringPdfCreator
	Implements IPdfCreator

	Public Sub CreatePdf(ByVal htmlString As String)
		Dim renderer = New ChromePdfRenderer()
		Dim pdf = renderer.RenderHtmlAsPdf(htmlString)
		pdf.SaveAs("HtmlStringPdf.pdf")
	End Sub
End Class
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: Factoryの使用

アプリケーションで、これらのファクトリーを使用して、PDF作成プロセスの詳細を気にすることなく、さまざまなソースからPDFドキュメントを作成することができるようになりました。

class Program
{
    static void Main(string [] args)
    {
    License.LicenseKey = "License-Key";
        IPdfCreator htmlPdfCreator = new HtmlStringPdfCreator();
        htmlPdfCreator.CreatePdf("<h1>Hello, World!</h1>");
        IPdfCreator urlPdfCreator = new UrlPdfCreator();
        urlPdfCreator.CreatePdf("http://example.com");
    }
}
class Program
{
    static void Main(string [] args)
    {
    License.LicenseKey = "License-Key";
        IPdfCreator htmlPdfCreator = new HtmlStringPdfCreator();
        htmlPdfCreator.CreatePdf("<h1>Hello, World!</h1>");
        IPdfCreator urlPdfCreator = new UrlPdfCreator();
        urlPdfCreator.CreatePdf("http://example.com");
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
	License.LicenseKey = "License-Key"
		Dim htmlPdfCreator As IPdfCreator = New HtmlStringPdfCreator()
		htmlPdfCreator.CreatePdf("<h1>Hello, World!</h1>")
		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インターフェースを実装するファクトリーを追加するだけです。

出力

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

Factory パターン C#(開発者向けの動作方法):図 3 - Factory デザインパターン PDF 出力

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

結論

ファクトリーパターンC#(開発者向けの動作方法):図5 - ライセンス

C#におけるファクトリパターンは、オブジェクトの生成を管理するためのフレームワークを提供し、ソフトウェアの設計をより保守しやすく、拡張可能にします。 具体的なクラスを使用して抽象ファクトリーを実装し、生成ロジックを委譲することで、開発者は適応性と拡張性が高いシステムを構築することができます。 クラスが数個で構成されたものか、複雑な依存関係を持つシステムであっても、ファクトリーパターンは正確なクラスオブジェクトの作成に対して構造化されたアプローチを提供します。 ユーザー入力、設定、アプリケーションの状態によって作成されるオブジェクトの種類が変わるシナリオにおいて特に有益です。

IronPDFは、IronPDFの無料トライアルを提供しており、ライセンスオプションは$749から始まります。.NETアプリケーションにPDF機能を統合しようとしている開発者向けに対応しています。

チペゴ
ソフトウェアエンジニア
チペゴは優れた傾聴能力を持ち、それが顧客の問題を理解し、賢明な解決策を提供する助けとなっています。彼は情報技術の学士号を取得後、2023年にIron Softwareチームに加わりました。現在、彼はIronPDFとIronOCRの2つの製品に注力していますが、顧客をサポートする新しい方法を見つけるにつれて、他の製品に関する知識も日々成長しています。Iron Softwareでの協力的な生活を楽しんでおり、さまざまな経験を持つチームメンバーが集まり、効果的で革新的な解決策を提供することに貢献しています。チペゴがデスクを離れているときは、良い本を楽しんだり、サッカーをしていることが多いです。
< 以前
C# 文字列内の文字を置換する方法(開発者向け)
次へ >
C# 小数点以下第2位までに丸める方法(開発者向けの動作原理)