javascript設計モードの工場モデル例解説


javaScript工場方式のオリジナルの方式は対象の属性がオブジェクトの作成後に動的に定義されるため、JavaScriptが最初に導入された時には下記のようなコードが作成されます。

var oCar = new Object;
oCar.color = "blue";
oCar.doors = 4;
oCar.mpg = 25;
oCar.showColor = function() {
  alert(this.color);
};
上記のコードにおいて、対象carを作成します。それからいくつかの属性を設定します。色は青で、4つのドアがあります。1ガロン当たり25マイル走れます。最後の属性は実際に関数を指すポインタであり、この属性は方法であることを意味する。このコードを実行すると、対象carが使用できます。しかし、ここで問題があります。複数のcarのインスタンスを作成する必要があります。これは明らかにあまり良い方法ではありません。
ソリューション:工場法はこの問題を解決するために、開発者は特定のタイプのオブジェクトを作成して返すことができる工場関数を作成しました。例えば、関数createCar()は、前にリストされたcarオブジェクトをパッケージ化する動作に使用されてもよい。

function createCar(sColor,iDoors,iMpg) {
  var oTempCar = new Object;
  oTempCar.color = sColor;
  oTempCar.doors = iDoors;
  oTempCar.mpg = iMpg;
  oTempCar.showColor = function() {
    alert(this.color);
  };
  return oTempCar;
}

var oCar1 = createCar("red",4,23);
var oCar2 = createCar("blue",3,25);

oCar1.showColor();        // "red"
oCar2.showColor();        // "blue"

この工場関数を呼び出して、新しいオブジェクトを作成し、必要な属性をすべて与えます。createCar関数にパラメータを加えると、作成するcarオブジェクトのカラー、doors、mpg属性に値が付けられます。これにより、2つのオブジェクトは同じ属性を持つが、異なる属性値を持つようになる。この方法は、各オブジェクトのためにshowColor方法を作成する際に、必要ではなく、実際には、各オブジェクトが同じ関数を共有することが、carオブジェクトを作成するごとに繰り返されることがよくない。そこで,その方法特性を関数の外で宣言することを試みた。
工場の関数外でオブジェクトを定義する方法の中には、開発者が工場の関数外でオブジェクトを定義する方法があり、属性を通してこの方法を指します。

function showColor() {
  alert(this.color);
}

function createCar(sColor,iDoors,iMpg) {
  var oTempCar = new Object;
  oTempCar.color = sColor;
  oTempCar.doors = iDoors;
  oTempCar.mpg = iMpg;
  oTempCar.showColor = showColor;
  return oTempCar;
}

var oCar1 = createCar("red",4,23);
var oCar2 = createCar("blue",3,25);

oCar1.showColor();        // "red"
oCar2.showColor();        // "blue"

上記のように書き換えられたコードの中で、関数createCar()の前に関数show Color()が定義されています。createCar()の内部で、対象に既存のshowColor()関数を指すポインタを与えます。機能的には、関数オブジェクトを繰り返し作成する問題を解決します。しかし、意味的には、この関数は対象とはあまり似ていない。