今回は『Java言語で学ぶデザインパターン入門』からBuilderパターン。
クラス数が多くなってきたのでクラス図を示しておこう。
今回のパターンのクライアントであるメインメソッドで、Directorクラスを生成する。このDirectorクラスを使いながら、抽象クラスであるBuilderクラスを通してTextBuilderとHTMLBuilderを利用する。Javaのサンプルではコマンドラインからの引数でどちらのBuilderを使用するかを決定するようになっているが、今回は両方を生成し実行するようにしている。TextBuilderのほうか結果をコンソールに、HTMLBuilderのほうはGreeting.htmlというファイルに結果のHTMLを書き出すようになっている。
今回の実装もほとんどJavaのサンプルコードそのまま。ただし、getResultメソッドに関しては、Objective-CのProperty機能を使うことにした。
まず、抽象クラスであるBuilderクラスのヘッダーでの宣言を以下のようにする。
@property(readonly) NSString* result;
結果を戻すだけなので属性をreadonlyとし、結果はNSStringで戻すこととした。戻す内容はTextBuilderとHTMLBuilderで異なるのでBuilderクラスでのImplementation部での宣言は
@dynamic result;
として、実行時に子クラスでオーバーライドされることを明示する。
TextBuilderではresultに結果のテキストそのもの返すため、結果を格納するNSStringのオブジェクト_bufferを定義し、
@synthesize result=_buffer;
としてプロパティresultと関連付ける。これだけでTextBufferにresultというメッセージを投げるとメソッドの定義なしで_bufferの内容を返してくれる。
HTMLBuilderでは結果については、
[_buffer writeToFile:_filename atomically:YES
encoding:NSUTF8StringEncoding error:NULL];
としてファイルに書き出し、resultでは_filenameを返すようにする。

コメント
コメントを投稿