Factory Method

Summary

ファクトリメソッドは、クライアントの指示に従って新しいオブジェクトを作成します。 JavaScriptでオブジェクトを作成する1つの方法は、new演算子を使用してコンストラクタ関数を呼び出すことです。 しかし、クライアントがインスタンス化する複数の候補オブジェクトのうちのどれを知っていない、または知ってはならない状況があります。 ファクトリメソッドを使用すると、クライアントはオブジェクトの作成を委任することができますが、インスタンス化する型の制御は維持されます。

ファクトリメソッドの主な目的は拡張性です。 ファクトリメソッドは、異なるオブジェクトのコレクションを管理、保守、または操作するアプリケーションで頻繁に使用されますが、同時に多くの特 例としては、Xml文書、Pdf文書、Rtf文書が混在した文書のコレクションがあります。

図JavaScriptファクトリメソッドデザインパターン

参加者

このパターンに参加するオブジェク: Factory

  • 新しい製品を作成する’factory’オブジェクト
  • 新しく作成された製品を返す’factoryMethod’を実装します
  • AbstractProduct–JavaScriptでは使用されません
    • 製品のインターフェイスを宣言します
  • ConcreteProduct–サンプルコードでは:Employees
    • 作成されている製品
    • すべての製品が同じインターフェイス(プロパティとメソッド)をサポートしています。
  • JavaScriptのサンプルコード

    このJavaScriptの例では、ファクトリオブジェクトは4つの異なるタイプの従業員を作成します。 各従業員の種類には、異なる時給があります。 CreateEmployeeメソッドは、実際のファクトリメソッドです。 クライアントは、ファクトリメソッドに型引数を渡すことによって、どのタイプの従業員を作成するかをファクトリに指示します。

    Javascriptは抽象クラスまたはインターフェイスをサポートしていないため、図のAbstractProductは実装されていません。 ただし、すべてのemployee型が同じインターフェイス(プロパティとメソッド)を持つことを確認する必要があります。

    四つの異なる従業員のタイプが作成され、すべてが同じ配列に格納されています。 各従業員は、彼らが何であるかと彼らの時給を言うように求められます。

    log関数は、結果を収集して表示するヘルパーです。 p>

    function Factory() { this.createEmployee = function (type) { var employee; if (type === "fulltime") { employee = new FullTime(); } else if (type === "parttime") { employee = new PartTime(); } else if (type === "temporary") { employee = new Temporary(); } else if (type === "contractor") { employee = new Contractor(); } employee.type = type; employee.say = function () { log.add(this.type + ": rate " + this.hourly + "/hour"); } return employee; }}var FullTime = function () { this.hourly = "$12";};var PartTime = function () { this.hourly = "$11";};var Temporary = function () { this.hourly = "$10";};var Contractor = function () { this.hourly = "$15";};// log helpervar log = (function () { var log = ""; return { add: function (msg) { log += msg + "\n"; }, show: function () { alert(log); log = ""; } }})();function run() { var employees = ; var factory = new Factory(); employees.push(factory.createEmployee("fulltime")); employees.push(factory.createEmployee("parttime")); employees.push(factory.createEmployee("temporary")); employees.push(factory.createEmployee("contractor")); for (var i = 0, len = employees.length; i Run 

    コメントを残す

    メールアドレスが公開されることはありません。