.NET ヘルプ

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

公開済み 2024年4月29日
共有:

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

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

We’ll explore the capabilities of IronOCR for .NET and how it enhances text recognition in scanned documents. This product by Iron Software provides advanced OCR (Optical Character Recognition) technology, allowing developers to integrate robust text extraction features into their applications.

IronOCR.NET向けの機能と、それがスキャンされたドキュメントのテキスト認識をどのように強化するかを探求します。このIron Softwareによる製品は、高度なOCR (Optical Character Recognition)技術を提供し、開発者がアプリケーションに強力なテキスト抽出機能を統合することを可能にします。IronPDF PDF生成ライブラリ後で。

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

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

  • プロダクトインターフェース:ファクトリーメソッドで作成されるオブジェクトの構造を指定します。
  • 具体的な製品クラス: 製品インターフェースを実装します。
  • クリエイタークラス(抽象クラス作成者)**: ファクトリーメソッドを宣言し、製品インターフェースのオブジェクトを返します。
  • 具体的なクリエーター: 具体的な製品のインスタンスを提供するためにファクトリーメソッドを変更します。

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

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

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

public interface IVehicle
{
    void DisplayInfo();
}
public interface IVehicle
{
    void DisplayInfo();
}
Public Interface IVehicle
	Sub DisplayInfo()
End Interface
VB   C#

ステップ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
VB   C#

ステップ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
VB   C#

ステップ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
VB   C#

ステップ 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
VB   C#

上記の例では、VehicleFactory クラスは抽象的なクリエーターとして機能しており、ConcreteVehicleFactory クラスはファクトリーメソッド CreateVehicle を実装する具体的なクリエーターです。 このメソッドは、受け取った入力に基づいて作成する車両の種類を決定します。 クライアントコードは、その後ファクトリーを使用して異なる車両のインスタンスを作成し、オブジェクト生成ロジックとクライアントコードの間の疎結合を促進します。

ファクトリパターン C#(開発者向けの仕組み):図1 - ファクトリデザインパターン出力

ファクトリーパターンを使用する利点

ファクトリーパターンは、特に複雑なシステムにおいていくつかの利点を提供します。

  • ルースカップリング: クライアントコードは、具体的な製品クラスではなく、インターフェースや抽象クラスとやり取りします。 これにより、より柔軟で変更しやすい設計が実現します。
  • 再利用可能なオブジェクト指向ソフトウェア:ファクトリーパターンは、オブジェクト生成のロジックをシステムから切り離すことでコードの再利用を促進し、システムの保守や拡張を容易にします。
  • オブジェクト作成の柔軟性: ファクトリーメソッドは、異なる実装によってオブジェクトを作成することができ、実行時に選択することが可能です。これは、必要とされるオブジェクトの種類が外部要因に基づいて変化するシナリオで特に有用です。

IronPDF: .NET PDFソリューション

ファクトリーパターン C# (開発者向けの動作方法): 図2 - IronPDF

IronPDFは、.NETプラットフォーム用に設計されたライブラリで、開発者がPDFファイルを簡単に作成、編集、操作できるように支援します。HTMLから直接PDFファイルCSS、画像、およびJavaScriptなどの複雑なPDF生成APIに触れることなく、ウェブコンテンツを迅速かつ高精度にPDFドキュメントに変換できる点が主な魅力です。これは、Chromeベースのレンダリングエンジンを使用しているおかげです。

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

コード例

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

IPdfCreatorという名前のインターフェースを作成し、PDFを作成するためのメソッドを定義します。その後、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
VB   C#

ステップ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
VB   C#

ステップ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
VB   C#

このセットアップでは、HtmlStringPdfCreatorUrlPdfCreator はPDFを生成する具体的なファクトリーです。 Program クラスはクライアントとして機能し、HTML文字列やURLからPDFが生成される詳細を知ることなく、これらのファクトリーを使用します。 このアプローチは柔軟性を提供し、新しいPDF作成方法を導入することができます(例えば、ファイルまたはストリームから)オブジェクト指向設計のオープン/クローズド原則に従い、IPdfCreatorインターフェースを実装するファクトリーを追加するだけで実現できます。

出力

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

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

ファクトリーパターン C#(開発者向けの動作説明):図4 - ベースファクトリーメソッドの出力

結論

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

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

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

< 以前
C# 文字列内の文字を置換する方法(開発者向け)
次へ >
C# 小数点以下第2位までに丸める方法(開発者向けの動作原理)