単純なファクトリー・パターンは、ファクトリー・パターンのブログで紹介されているはずです。なぜなら、ここでは、別の章に抽出される戦略パターンとある程度の類似性があるからです。
単純なファクトリパターン
別のクラスでインスタンスを作成するプロセスがファクトリです。
基本コード
#include <iostream> using namespace std; クラスAbstractProduct { パブリック: 仮想〜AbstractProduct(){} 仮想ボイド動作()= 0 ; }; クラス ProductA:public AbstractProduct { public : void Operation(){cout << "ProductA" << endl; } }; クラス ProductB:public AbstractProduct { public : void Operation(){cout << "ProductB" << endl; } }; クラスFactory { public: AbstractProduct * createProduct(char product){ AbstractProduct * ap = NULL; スイッチ(製品){ ケース 'A':ap = new ProductA(); 休憩; ケース 'B':ap = new ProductB(); 休憩; } return ap; } }; int main(){ Factory * f = new Factory(); AbstractProduct * apa = f-> createProduct( 'A' ); apa- > Operation(); // ProductA AbstractProduct * apb = f-> createProduct( 'B' ); apb- > Operation(); // ProductB delete apa; Apbを削除します。 fを削除します。 0を返します。 }
シンプルなコンピューティングファクトリ
class OperationFactory { public : Operation createOperate(string Opera ) { Operation oper = null ; スイッチ(操作) { ケース " + " : oper = new OperationAdd(); 休憩; ケース " - " : oper = new OperationSub(); 休憩; ケース " * ": oper = new OperationMul(); 休憩; ケース " / " : oper = new OperationDiv(); 休憩; } 戻り演算子。 } };
単純な工場モデルと戦略モデルの比較
以前に学習した戦略パターンを思い出すには、このUML図を参照してください
2つは似ているように見えますか?
唯一の違いは、単純なファクトリクラスとコンテキストクラスです。
元のブログはJavaで実装されており、閲覧や理解に影響を与えないため、変更なしに直接ここにコピーされます。
単純なファクトリクラスコードおよびクラス区分コンテキスト
の単純なファクトリクラス:
の単純なファクトリクラス:
public class OperationFactory { public static Operation CreateOperate(string Operate ) { Operation oper = null ; スイッチ(操作) { ケース " + " : oper = new OperationAdd(); 休憩; ケース " - " : oper = new OperationSub(); 休憩; 場合 " * " : oper = new OperationMul(); 休憩; ケース " / " : oper = new OperationDiv(); 休憩; デフォルト: oper = new Operation(); 休憩; } 戻り演算子。 } }
戦略パターンのContextクラス:
class Context { CashSuper csuper; public Context(CashSuper cs) { this .csuper = cs; } public double GetResult(double money) { // 特定の戦略クラスの課金メソッドを呼び出す return csuper.acceptCash(money); } }
1.最初に受信したパラメーターを確認します。シンプルファクトリクラスのCreateOperateメソッドは文字列を受信してOperationオブジェクトを返し、Contextクラスは初期化時にCashSuperオブジェクトを受信する必要があります。
2.シンプルファクトリクラスでは、受信した条件に従って対応するオブジェクトが作成され、Contextクラスがオブジェクトを受信すると、メソッドを呼び出してこのオブジェクトのメソッドを実行できます。
単純なファクトリー・パターンと戦略パターンの要約
1.タイプに関して、単純なファクトリー・パターンは作成パターンに属し、戦略パターンは行動パターンに属します。
2.次に、小さな例を見てみましょう。
斧には多くの種類があり、さまざまなニーズの斧の生産に特化した工場があります。
ファクトリーモード:
1)たとえば、人を切り取るなど、さまざまな用途で軸を作成する目的に応じて、工場は人を切るための斧を作成し、ログを記録する場合は、ロギング用の斧を作成します。
2)返された属性に応じて異なる動作を生成するオブジェクトのタイプ。
3)オブジェクト作成
戦略モードに焦点を当て ます
。1)ファクトリーによって生成された斧を使用して対応することを実行します。たとえば、斧を使用して人を切り、斧を使用して木を切ります。
2)対応するメソッドは、指定した対応するオブジェクトに従って実行されます。
3)注意行動の選択
3.単純なファクトリーモデル:顧客の選択の条件に従って、顧客がオブジェクトを作成するのを支援します。
戦略モード:顧客はそれに作成されたオブジェクトを渡し、顧客が対応することを行うのを助けます。
二つのモデルの長所と短所
クライアントコードの二つのモードを初めて目:
// シンプルファクトリモードのクライアント: Operation op; // シンプルファクトリクラスに ハンドオーバーしてオブジェクトを作成する op = OperationFactory.CreateOperate(" + " ); op.StrNumberA = 10 ; op.StrNumberB = 20 ; // 生成されたオブジェクトを呼び出すメソッド double result = op.GetResult(); Console.WriteLine(result);
// 戦略モードのクライアント: double total = 0 ; private void btnOk_Click(object sender、EventArgs e) { CashContext cc = null ; // クライアントがオブジェクト スイッチを作成(cbxType.SelectedItem.ToString()) { case:" 通常の料金" : cc = new CashContext(new CashNormal()); break ; case:" 300を超えると100を返します" : cc =new CashContext(new CashReturn()); break ; case:" 20%off " : cc = new CashContext(new CashRebate()); break ; } // 特定の戦略によって請求される料金を計算し、対応するメソッドを実行するためにコンテキストクラスに渡す、クライアントは戻り値を受け取るだけでよい double acceptMoney = cc.GetResult(Convert.ToDouble(txtPrice.Text)* Convert.ToDouble(txtNum.Text)); // 総コストの 合計を計算 + = acceptMoney; listBox1.Items .Add(" 単価:" + txtPrice.Text + "数量:" + txtNum.Text + " " + comboBox1.SelectedItem.ToString()+ " 总计:" + acceptMoney); lblResult.Text = total.ToString(); }
クライアントのコードを比較すると、
単純なファクトリパターンであることがわかり ます。オブジェクトの作成は単純なファクトリクラスに渡されます。クライアントは対応する条件を入力するだけでよく、オブジェクトの作成を担当しませんが、アルゴリズムクラスのメソッドを呼び出す必要があります。 。ただし、オープンルート操作などの新しい操作クラスを追加する必要がある場合は、単純なファクトリクラスを変更する必要があります。
戦略モード:オブジェクトの選択と作成は引き続き自分で行う必要がありますが、メソッドを呼び出す責任はContextクラスに与えられます。新しい戦略を追加する必要がある場合は、クライアントを変更する必要があります。
したがって、単純なファクトリモデルの欠点は、新しい需要が増えると、ファクトリクラスを頻繁に変更する必要があることです。戦略モードのみが使用されます。新しい要件が増加した場合、クライアントを変更する必要があります。クライアントはオブジェクトの作成を担当し、クライアントへのプレッシャーを軽減しません。これら2つのモードを一緒に使用するには、Contextクラスを変更する必要がありますが、これは完璧ではありません。