Flex、AIR、Java、Androidなど

1月9日 2009

prototypeパターンの理解

Posted by: tachibana In: プログラミング

※この記事は私が本を読み、頭で考えたことを将来完全に理解してから見直して笑ったりするためにそのまま羅列したものです。故に間違った理解や意味不明なこともたくさん出てくると思います。プログラミングを教えるような立場の方には有益かも(笑)?

Prototypeパターンの理解

なんで= new Manager使うのか?

これまでのパターンはインターフェースをextendなりimplementしたクラスを、メインクラス上でそれらのスーパークラス(extendの際は)であるクラスに代入していた。prototypeパターンの場合のクラスの関係はManagerクラスは何もextendもimplementもせず、動くメソッドをもっているだけ。→抽象クラスではない(抽象クラスをextendする可能性もあるか? or してはいけない理由があるのか?)。

この場合、Managerクラスの働きはそれ自身に(key、Obj)の形のハッシュを置き、それのメソッドに引数が渡されcloneされようとした際にはkeyからハッシュを舐め、それをProductインターフェースが持つメソッドに委譲しProductを返す。

ちょっと待った。cloneというメソッドはJavaのクラスライブラリにすでにあるんだよな。<自分自身かサブクラスからしか呼び出せない。

サンプルプログラム。Managerクラスにはkeyとして与えられた文字列に対してあるクラスのインスタンスを返すような連想配列が置かれる。後に生成されるインスタンスは型は全て同じ。だが、内容は異なる。そして全て同じインターフェースをimplementしている。それにサブクラスを代入。代入はnewでインスタンス化されるのではなく、あらかじめmanagerのメソッドが行う。

Prototypeされたクラスはmanagerクラスによりメインクラスにkeyとともに初期化(インスタンスが存在するようになる)され格納される。即ち、managerを使い新たにオブジェクトを存在させる手順は、newしているのではなく連想配列に格納されたインスタンスを返しているだけである。これは自分にとって新しい。

もしmanagerクラスがなかったらどうなる?

まずクラスは毎回インスタンス化され始めて使えるようになる。その際コンストラクタによりある程度のカスタムは可能だが、あまり複雑なものは利用できない。

大切なのは、再利用されるパーツとしての価値を考えたとき、そのパッケージ内のクラスが他のクラスに依存しないこと。そのまま他のプロジェクトにimportされた時でも引数を付けて呼ばれた際には常に同じ動作をするよう設計されていること。その際にはProductインターフェースの存在は必須となる。managerはkeyによりProduct型のインスタンスを返し、ProductインターフェースはCloneableで、複製を行う抽象メソッドを定める。

自分なりの結論:

生成のたびにわざわざクラスからインスタンス化する必要がなくcloneでもよいオブジェクトや、ユーザーの任意の操作により変更されたオブジェクトを複製したい時に使う。通常インスタンス化されたオブジェクトを返すためにはその為のメソッドを用意する必要があったり、それを受け取るために受け取る側でも変数を定義してやる必要があったりでややこしい。このような時はCloneableを便宜上実装したインターフェースを作る等し、実際に仕事をするクラスにはそれを実装させる。ここでは、複製されたオブジェクトを返すメソッドの定義が実装するインターフェースにより義務付けられている。一つの親クラスを継承した何種類かのクラスがあり、それらのインスタンスを連想配列に保管しいつでも返せるようなクラスを用意しておけば、インスタンス化と同時にそのクラスにインスタンスへの参照とキーを登録するといつでもインスタンスを得ることができる。ここで重要なのは登録されたインスタンスは親インターフェース型の変数であり、連想配列に登録されているのは値ではなく参照だということ。この参照先を新たな変数に代入することでコピーが行われ、新らしい変数が生成されることとなる。
EasyFreeAds Blog News Facebook Twitter Myspace Friendfeed Technorati del.icio.us Digg Google Yahoo Buzz StumbleUpon

No Responses to "prototypeパターンの理解"

Comments are closed.

Categories

 

2019年4月
« 4月    
1234567
891011121314
15161718192021
22232425262728
2930  

About

Author: tachibana

  • ちょっとしたことはTwitterに書いています。こっちはアプリの公開等の時に更新されます。
  • 最近はもっぱらJavaとObjective Cです。AS3は飽きました。
  • スクリプト言語ではPerlが好きでしたが最近はGAE/Jで何でもやってます。
  • Linuxは自宅サーバー建てるのがやっとのレベルです。前の会社で何日も徹夜してやったのはいい思い出です。
  • アプリへのご要望などご意見等ありましたらお気軽にご連絡下さい。

Alternative content here