第二回です。

本日のパターンはずばり・・・

Factory Method !!

【要するに】
クラスをインスタンス化して返すメソッドということです

【使いどころ】
あるクラスと一緒に使ってほしいクラスがあるとき

【詳細】
ここに丈助クラスと康一クラスがあります。
丈助クラスはクレイジーダイヤモンドクラスと
康一クラスはエコーズクラスと一緒に使ってほしいとします。

このときに
丈助クラスにcreateクレイジーダイヤモンドメソッドを持たせます
同様に
康一クラスにcreateエコーズメソッドを持たせます
こうすることで一緒に使ってほしいクラスを生成しやすくなります。

が! が! が!

これではスタンド名がわからないとメソッド名がわからないことになってしまします。
これはまずいです。

対処法を説明します。

クレイジーダイヤモンドクラスやエコーズクラスの親クラスとしてスタンドクラスを定義します。
丈助クラスと康一クラスの親クラスとしてスタンド使いクラスを定義します。

スタンド使いクラスにはcreateスタンドメソッドを定義します。
createスタンドメソッドは戻り値としてスタンドクラスを返します。
スタンド使いクラスにはcreateスタンドメソッドが定義されているので
スタンド使いにしたい人にはスタンド使いクラスを継承させればよいということになります。

その上で次に継承したスタンド使いクラスのcreateスタンドメソッドを
丈助クラスや康一クラスでオーバーライドし
クレイジーダイヤモンドクラスやエコーズクラスのオブジェクトを返します。

そうすることによって
スタンドを呼びたい場合にはスタンド使いのcreateスタンドメソッドを呼べば
対象のスタンドのオブジェクトが返ってくる様になります。

ちょっとクラス構造が複雑になりますが
非常に便利なパターンだと思います。

今日はJOJOネタでお送りしました。
デザインパターンの復習をしてみる。
やっぱりアウトプットは重要だよね!!

ということで第一回は・・・

Abstract Factory!!

【要するに】
Factory Methodはnewする代わりに生成メソッドを追加する

【使いどころ】
多数のクラス群をごっそり切り替える場合にAbstract Factory パターンを適用する

【詳細】
抽象クラス 車Factory には Createタイヤ() Createエンジン()などという抽象メソッドがあるとします。
これらは 車Factoryクラスを継承した スポーツカーFactoryクラスで実装されます。
きっとこの場合のCreateタイヤメソッドは高速で走っても劣化しづらくグリップ力のあるものなのでしょう。
きっとこの場合のCreateエンジンメソッドはモンスターエンジンなのでしょう。

車Factoryクラスを継承したポンコツマシンFactoryクラスがあったとします。
きっとこの場合のCreateタイヤメソッドはホイールだけかもしれません。。
きっとこの場合のCreateエンジンメソッドはミニ四駆のモーターかもしれません。

さて車Factoryの話に戻りましょう。
実際に車Factoryから車を生成する場合はこうします。
「車Factoryさんよ、スポーツカーをよこせよ」
すると車Factoryは自らを継承しているスポーツカーFactoryクラスを渡します。
「車Factoryさんよ、ポンコツでいいのでくださいorz」
すると車Factoryは自らを継承しているポンコツマシンFactoryクラスを渡します。

これらのクラスはcreateタイヤメソッドやcreateエンジンメソッドを実装しているので
ここから車としての機能を提供していきます。

スポーツカーFactoryクラスやポンコツマシンFactoryクラスを渡す際に
タイヤやエンジンは生成しておいてあげるっていうのもいいかもしれません。

車がほしくなったときに自分でスポーツカーやポンコツをNewするのではなく
「車工場にこんなんほしいんすけど~」といって電話して
届けてもらうようなイメージです。



AS3にてリフレクション処理を行う際のメモ
var t:XML = describeType(クラスのインスタンス);
for each (var m:XML in t.method) {
if (m.@declaredBy == t.@name) {
trace(String(m.@name));
//ここで実行
obj[m.@name].apply(null);
}
}