.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 タイプのストア アルゴリズムを計算できます。
以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。また、皆さんも php 中国語のウェブサイトをサポートしていただければ幸いです。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









c言語のシンボルの使用方法は、算術、割り当て、条件、ロジック、ビット演算子などをカバーします。算術演算子は基本的な数学的操作に使用されます。割り当てと追加、下位、乗算、除算の割り当てには、条件操作に使用されます。ポインター、ファイル終了マーカー、および非数値値。

Cでは、文字列でCharタイプが使用されます。1。単一の文字を保存します。 2。配列を使用して文字列を表し、ヌルターミネーターで終了します。 3。文字列操作関数を介して動作します。 4.キーボードから文字列を読み取りまたは出力します。

C言語では、以下などのエスケープシーケンスを通じて特殊文字が処理されます。\ nはラインブレークを表します。 \ tはタブ文字を意味します。 ESACEシーケンスまたは文字定数を使用して、Char C = '\ n'などの特殊文字を表します。バックスラッシュは2回逃げる必要があることに注意してください。さまざまなプラットフォームとコンパイラが異なるエスケープシーケンスを持っている場合があります。ドキュメントを参照してください。

マルチスレッドと非同期の違いは、マルチスレッドが複数のスレッドを同時に実行し、現在のスレッドをブロックせずに非同期に操作を実行することです。マルチスレッドは計算集約型タスクに使用されますが、非同期はユーザーインタラクションに使用されます。マルチスレッドの利点は、コンピューティングのパフォーマンスを改善することですが、非同期の利点はUIスレッドをブロックしないことです。マルチスレッドまたは非同期を選択することは、タスクの性質に依存します。計算集約型タスクマルチスレッド、外部リソースと相互作用し、UIの応答性を非同期に使用する必要があるタスクを使用します。

C言語では、charとwchar_tの主な違いは文字エンコードです。CharはASCIIを使用するか、ASCIIを拡張し、WCHAR_TはUnicodeを使用します。 Charは1〜2バイトを占め、WCHAR_Tは2〜4バイトを占有します。 charは英語のテキストに適しており、wchar_tは多言語テキストに適しています。 CHARは広くサポートされており、WCHAR_TはコンパイラとオペレーティングシステムがUnicodeをサポートするかどうかに依存します。 CHARの文字範囲は限られており、WCHAR_Tの文字範囲が大きく、特別な機能が算術演算に使用されます。

C言語では、charタイプの変換は、キャスト:キャスト文字を使用することにより、別のタイプに直接変換できます。自動タイプ変換:あるタイプのデータが別のタイプの値に対応できる場合、コンパイラは自動的に変換します。

C言語に組み込みの合計機能はないため、自分で書く必要があります。合計は、配列を通過して要素を蓄積することで達成できます。ループバージョン:合計は、ループとアレイの長さを使用して計算されます。ポインターバージョン:ポインターを使用してアレイ要素を指し示し、効率的な合計が自己概要ポインターを通じて達成されます。アレイバージョンを動的に割り当てます:[アレイ]を動的に割り当ててメモリを自分で管理し、メモリの漏れを防ぐために割り当てられたメモリが解放されます。

Char Arrayは文字シーケンスをC言語で保存し、char array_name [size]として宣言されます。アクセス要素はサブスクリプト演算子に渡され、要素は文字列のエンドポイントを表すnullターミネーター「\ 0」で終了します。 C言語は、strlen()、strcpy()、strcat()、strcmp()など、さまざまな文字列操作関数を提供します。
