ホームページ >バックエンド開発 >C#.Net チュートリアル >.NETファクトリメソッドパターンの説明
ファクトリ メソッド パターンの紹介:
ファクトリ メソッド パターンの意味は、製品オブジェクトを作成するファクトリ インターフェイスを定義し、実際の作成作業をサブクラスに延期することです。このようにして、コア ファクトリ クラスはプロダクトの作成を担当しなくなり、特定のファクトリ サブクラスが実装する必要があるインターフェイスのみを担当する抽象ファクトリ ロールになり、ファクトリ メソッド パターンをさらに抽象化することの利点が得られます。特定の工場の役割を変更せずにシステムを運用できるようになり、新製品が導入されます。
ファクトリ メソッド パターンの構造図:
役割分類:
抽象的なファクトリ ロール: ファクトリ メソッド パターンの中核であり、アプリケーションとは何の関係もありません。パターンで作成されたオブジェクトのファクトリ クラスはすべて、このインターフェイスを実装する必要があります。
具体的なファクトリ ロール: これは、抽象ファクトリ インターフェイスを実装する具体的なファクトリ クラスであり、アプリケーションに密接に関連するロジックが含まれており、製品オブジェクトを作成するためにアプリケーションによって呼び出されます。
抽象的な製品の役割: によって作成されるオブジェクトのスーパー タイプファクトリ メソッド パターン。つまり、製品オブジェクトの共通の親クラスまたは共通に所有されるインターフェイスです。上の写真では、このキャラクターはライトです。
具体的な製品ロール: このロールは、抽象的な製品ロールによって定義されたインターフェイスを実装します。特定の製品は特定の工場で作られ、それらの間には 1 対 1 の対応関係があることがよくあります。
実践例の紹介:
前回のブログ投稿「シンプル ファクトリ パターン」では、シンプル ファクトリ パターンを使用して次の実装が実装されました: テナント管理システムがある場合、その中のテナント タイプは可変であり、各テナントの家賃は例:Aタイプ入居者の家賃額=日数×単価+実績×0.005、Bタイプ入居者の家賃金額=月×(月額+実績×0.001)と計算式が異なります。ここで顧客のニーズは満たされましたが、顧客が後で C タイプ ストアと D タイプ ストアを追加する必要があり、アルゴリズム要件が異なる場合は、この時点で C タイプ ストアと D タイプ ストアを作成する必要があります。 、Ishop インターフェイスを継承し、内部のメソッドを実装し、対応するストア オブジェクトをキャプチャして作成するために、引き続きファクトリ クラスを変更し、スイッチにケースを追加する必要があります。このような状況が発生すると、プログラムのスケーラビリティに悪影響を及ぼします。そしてその後のプロジェクトのメンテナンス。
1. 分析: 店舗には共通の動作特性があり、店舗家賃の計算動作を実行する必要があります。Ishop には、実装される店舗家賃の計算方法が含まれています。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace FactoryEntiy { public interface Ishop { double Getrent(int days, double dayprice, double performance); } }
2. Isho インターフェースにメソッドを実装し、タイプ A と B のストアを作成します。
using FactoryEntiy; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ProductEnity { /// <summary> /// 继承商店接口,实现里面的行为方法,即算法 /// </summary> public class Ashop:Ishop { /// <summary> /// /// A类型商店租金额,天数*单价+绩效*0.005 /// </summary> /// <param name="days">天数</param> /// <param name="dayprice">每天单价</param> /// <param name="performance">日平均绩效</param> /// <returns></returns> public double Getrent(int days, double dayprice, double performance) { Console.WriteLine("A商店的租金算法"); return days * dayprice + performance * 0.01; } } }
using FactoryEntiy; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ProductEnity { /// <summary> /// 继承商店接口,实现里面的行为方法,即算法 /// </summary> public class Bshop:Ishop { /// <summary> /// B类型商店的租金=月份*(每月价格+performance*0.001) /// </summary> /// <param name="month">月数</param> /// <param name="monthprice">月单价</param> /// <param name="performance">月平均绩效</param> /// <returns></returns> public double Getrent(int month, double monthprice, double performance) { Console.WriteLine("B商店的租金算法"); return month * (monthprice + performance * 0.001); } } }
3. 次に、店舗エンティティを作成し、さまざまな店舗の賃料を計算し、将来の追加や変更を容易にする状況を検討します。そこで、実装するストア オブジェクトを作成するメソッドを含む IFactroy インターフェイスを作成します。
using FactoryEntiy; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace FactoryMethod { /// <summary> /// 工厂类,创建商店类型实体 /// </summary> public interface IFactory { Ishop CreateShop(); } }
4. これで、IFactory を継承し、その中に対応するストア オブジェクトを作成できます。
using FactoryEntiy; using FactoryMethod; using ProductEnity; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ProductEnity { /// <summary> /// 继承工厂类,创建A类型商店实体 /// </summary> public class CreateBshop : IFactory { public Ishop CreateShop() { return new Ashop(); } } }
using FactoryEntiy; using FactoryMethod; using ProductEnity; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ProductEnity { /// <summary> /// 继承工厂类,创建B类型商店实体 /// </summary> public class CreateAshop : IFactory { public Ishop CreateShop() { return new Bshop(); } } }
5. 次に、現在のストア タイプに基づいて、このタイプのストアにどのアルゴリズムを使用するかを判断します。
using FactoryEntiy; using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Reflection; using System.Text; namespace FactoryMethod.App { class Program { static void Main(string[] args) { string shopname = ConfigurationManager.AppSettings["CreateShopClassName"]; //shopname为创建商店类名称,此处=CreateAshop IFactory af = (IFactory)Assembly.Load("ProductEnity").CreateInstance("ProductEnity." + shopname); //第一个ProductEnity是dll的名称,第二个ProductEnity是项目的命名空间。 Ishop As = af.CreateShop(); double total = As.Getrent(30, 300, 2000); //30 天/100元 日平均绩效为2000 Console.WriteLine("该A类型商店的租金为:" + total); Console.WriteLine("============="); IFactory bf = (IFactory)Assembly.Load("ProductEnity").CreateInstance("ProductEnity." + "CreateBshop"); //CreateBshop可以保存为配置或者存在数据库中, //注意该保存字符串应该与项目中创建的类名一样, //否则反射的方式会找不到该项目下的类。 Ishop Bs = bf.CreateShop(); total = Bs.Getrent(30, 300, 2000); //30 天/100元 日平均绩效为2000 Console.WriteLine("该A类型商店的租金为:" + total); } } }
ここでは、リフレクションを使用してオブジェクトを作成し、前のものを置き換えます。ファクトリ クラスはスイッチを通じてオブジェクトを作成します。これは、その後の新しいタイプのストアの追加やアルゴリズムの変更、追加、メンテナンスに役立ちます。将来プロジェクトの要件が変更された場合、C および D タイプのストアをプロジェクトに再追加するだけで済みます。内部のメソッドは、同時に Ishop 実装を継承し、IFactroy インターフェイスを追加し、対応するストア オブジェクトを作成し、プロジェクトの ProductEnity.dll をコンパイルして、変更せずにリフレクションを通じて C、D タイプのストア アルゴリズムを計算します。オリジナルのエンジニアリングコード。
プロジェクト全体の構造図は以下の通りです: