シンプル ファクトリ パターンの紹介:
シンプル ファクトリ パターンは、静的ファクトリ メソッド パターンとも呼ばれる作成パターンですが、23 の GOF デザイン パターンの 1 つではありません。単純なファクトリ パターンでは、ファクトリ オブジェクトを使用して、どの製品クラス インスタンスを作成するかを決定します。シンプル ファクトリ パターンは、ファクトリ パターン ファミリの中で最も単純かつ最も実用的なパターンであり、さまざまなファクトリ パターンの特別な実装として理解できます。
構造パターン図:
役割分類:
ファクトリ (作成者) ロール
単純なファクトリ パターンの中核であり、すべてのインスタンスを作成する内部ロジックの実装を担当します。ファクトリ クラスでプロダクト クラスを作成するメソッドは、外部から直接呼び出して、必要なプロダクト オブジェクトを作成できます。
抽象的な製品の役割
単純なファクトリ パターンによって作成されたすべてのオブジェクトの親クラスは、すべてのインスタンスに共通のパブリック インターフェイスを記述する役割を果たします。
Concrete Product ロール
は、単純なファクトリ パターンの作成ターゲットです。作成されるすべてのオブジェクトは、このロールを実行する特定のクラスのインスタンスです。
実際の状況を紹介します:
テナント管理システムがある場合、その中のテナントタイプは可変であり、テナントタイプごとに家賃の計算式が異なります
タイプAのテナントの家賃金額 = 日数*単価+実績*0.005
B型世帯賃料=月*(月額+実績*0.001)
分析:
1 これが実店舗の行動です。ですが、動作が異なるので、ストア クラスを抽象化します。コードは次のとおりです。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactory.App.IFactroy { public interface Ishop { double Getrent(int days, double dayprice, double performance); } }
2. ストアを抽象化した後、特定の製品クラスを作成する必要があります。特定のタイプのストア。ストアの動作メソッドを実装します。タイプ A のストアを作成します
using SimpleFactory.App.IFactroy; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactory.App.product { //A类型的商店的创建 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; } } }
3. タイプ B のストアを作成します:
using SimpleFactory.App.IFactroy; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactory.App.product { /// <summary> /// B类型的商店的创建 /// </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); } } }
4. タイプ ストアを作成してメソッドを実装した後、その種のオブジェクトを作成する方法を検討します。どのような状況で、単純なファクトリ パターンのコア部分であるファクトリ クラスが登場しました
using SimpleFactory.App.IFactroy; using SimpleFactory.App.product; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactory.App.factoryMethod { public class factorymethod { public Ishop CreateShow(string show) { switch (show.Trim().ToLower()) { case"ashop": return new Ashop(); case "bshop": return new Ashop(); default: throw new Exception("该商店不存在"); } } } }
5. 次に、現在のストア タイプに基づいて、このタイプのストアにどのアルゴリズムを使用するかを判断します:
using SimpleFactory.App.factoryMethod; using SimpleFactory.App.IFactroy; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactory.App { class Program { static void Main(string[] args) { Ishop As; factorymethod afm = new factorymethod(); As = afm.CreateShow("ashop"); //a 类型的某商店 double total = As.Getrent(30, 300, 2000); //30 天/100元 日平均绩效为2000 Console.WriteLine("该A类型商店的租金为:" + total); Console.WriteLine("============="); Ishop Bs; factorymethod bfm = new factorymethod(); Bs = bfm.CreateShow("bshop"); //b 类型的某商店 total = Bs.Getrent(3, 3000, 60000); //3 月/4000元 月平均绩效为60000 Console.WriteLine("该B类型商店的租金为:" + total); Console.ReadKey(); } } }
ここでは、顧客が必要とする 2 つのタイプのストアのアルゴリズム要件を実装しましたが、優れた設計アーキテクチャとして、顧客が C タイプのストアと D タイプのストアを追加した場合のその後の需要の変化も考慮する必要があります。 -type ストア、それらのアルゴリズム要件は異なります。この時点で、C および D タイプ ストアを作成し、Ishop インターフェイスを継承し、内部のメソッドを実装する必要があります。同時に、ファクトリ クラスの変更と追加を続ける必要があります。対応するストアをキャプチャして作成するように切り替える場合、そのような状況が発生すると、プログラムのスケーラビリティとその後のプロジェクトのメンテナンスに役立ちません。
利点:
単純なファクトリ パターンは、外部から与えられた情報に基づいてオブジェクトの特定のクラスを作成するかを決定できます。これにより、外部の世界は特定の製品オブジェクトを直接作成するという恥ずかしい状況を取り除くことができます。
外の世界は特定のクラスから隔離されており、偶然性が低い。
それぞれの責任と権限を明確に区別することで、ソフトウェア アーキテクチャ全体の最適化に役立ちます。
短所:
ファクトリクラスはすべてのインスタンスの作成ロジックを集中させているため、GRASPRの高い凝集性の責任割り当て原則に簡単に違反します
単純なファクトリパターンは特定の変更に適応できますが、解決できる問題は限定的ではありません。 。作成できるクラスは事前に考慮する必要があります。新しいクラスを追加する必要がある場合は、ファクトリ クラスを変更する必要があります。
生じた控訴状況をどのように解決するかは考える価値があり、次のファクトリーメソッドパターンでうまく解決されます。
以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。また、皆さんも PHP 中国語 Web サイトをサポートしていただければ幸いです。