PerlでBuilderパターン! (デザインパターン)

Perl初心者のためのPerlノートです!

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ WEBリーダー/ 燈明日記/ yahoo

◆ はじめに

本ページは、私がPerlを習得した時(いや習得中)のノートです。

ごく普通の言語(COBOL,C,Java,VB等)を知っている人が、Perlをやり始めるといろいろと悩むことがあります。

それは、

です。

本ページは、そのようなハードルを一つ一つクリアにしていけたらと思います。

そして、本ページが何かのお役に立てれば幸いです。では、ごゆっくりご覧ください。

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。

◆ サイト最新情報

◆ コンテンツ

2008-03-09 PerlでBuilderパターン! (デザインパターン)

Perlでデザインパターン 第7弾(Builderパターン)

Builderパターンとは、Director(監督)の管理下、Builder(親方)が作成項目だけ指示して、ConcreteBuilder(大工) に Building(家) インスタンスを生成させるデザインパターンです。

また、BuilderとConcreteBuilderの関係は、Templateパターンになっていますね。


一般的なBuilderパターンのクラス図
                    関連                   集約
  +---------------+      +---------------+      +---------------+
  | Client        |----->| Director      |o---->| Builder       |
  +---------------+      +---------------+      +---------------+
  |               |      | builder       |      |               |
  +---------------+      +---------------+      +---------------+
  |               |      | construct     |      | buildPart1    |
  |               |      |               |      | buildPart2    |
  |               |      |               |      | buildPart3    |
  +-------+-------+      +---------------+      +---------------+
          |                                             #        
          |                                             | 継承   
          |                                             |        
          |                                     +-------+-------+
          +------------------------------------>|ConcreteBuilder|
                                                +---------------+
                                                |               |
                                                +---------------+
                                                |buildPart1     |
                                                |buildPart2     |
                                                |buildPart3     |
                                                |getResult      |
                                                +---------------+

サンプル

一番下で紹介している本の『Java言語で学ぶデザインパターン入門』に書かれているBuilderパターンのJavaでのサンプルをPerlで書き換えてみました。


サンプルのクラス図
  +---------------+     +---------------+     +--------------+
  | Main          |---->| Director      |o--->| Builder      |
  +---------------+     +---------------+     +--------------+
  |               |     | builder       |     |              |
  +---------------+     +---------------+     +--------------+
  |               |     | construct     |     | makeTitle    |
  |               |     |               |     | makeString   |
  |               |     |               |     | makeItems    |
  |               |     |               |     | close        |
  +-------+-------+     +---------------+     +--------------+
          |                                           #        
          |                                           | 継承       
          |                                +----------+----------+
          |                                |                     |
          |                        +-------+-------+     +-------+-------+
          |                        | TextBuilder   |     | HTMLBuilder   |
          |                        +---------------+     +---------------+
          |                        | buffer        |     | filename      |
          |                        +---------------+     | writer        |
          |                        | makeTitle     |     +---------------+
          |                        | makeString    |     | makeTitle     |
          |                        | makeItems     |     | makeString    |
          |                        | close         |     | makeItems     |
          |                        | getResult     |     | close         |
          |                        |               |     | getResult     |
          |                        +---------------+     +---------------+
          |                                ^                     ^
          |                                |                     |
          +--------------------------------+---------------------+
Builder.pm
package Builder;
use strict;
use warnings;

sub makeTitle { die "オーバーライド必須"; }
sub makeString { die "オーバーライド必須"; }
sub makeItems { die "オーバーライド必須"; }
sub close { die "オーバーライド必須"; }
1;

Director.pm
package Director;
use strict;
use warnings;

sub new {
    my $class = shift;
    my $self = {};
    $self->{builder} = shift;
    return bless $self, $class;
}
sub construct {
    my $self = shift;
    $self->{builder}->makeTitle('Greeting');
    $self->{builder}->makeString('朝から昼にかけて');
    $self->{builder}->makeItems([
        'おはようございます。',
        'こんにちは。',
    ]);
    $self->{builder}->makeString('夜に');
    $self->{builder}->makeItems([
        'こんばんは。',
        'おやすみなさい。',
        'さようなら。',
    ]);
    return $self->{builder}->close;
}
1;

TextBuilder.pm

package TextBuilder;
use strict;
use warnings;
use base 'Builder';

sub new {
    my $class = shift;
    my $self = {};
    $self->{buffer} = '';
    return bless $self, $class;
}
sub makeTitle {
    my $self = shift;
    my $title = shift;
    $self->{buffer} .= "===========================\n";
    $self->{buffer} .= "『$title』\n\n";
}
sub makeString {
    my $self = shift;
    my $str = shift;
    $self->{buffer} .= "■$str\n\n";
}
sub makeItems {
    my $self = shift;
    my $items = shift;
    for my $i (0..$#{$items}) {
        $self->{buffer} .= " ・$items->[$i]\n";
    }
    $self->{buffer} .= "\n";
}
sub close {
    my $self = shift;
    $self->{buffer} .= "==========================\n";
}
sub getResult {
    my $self = shift;
    return $self->{buffer};
}
1;

HTMLBuilder.pm
package HTMLBuilder;
use strict;
use warnings;
use FileHandle;
use base 'Builder';

sub new {
    my $class = shift;
    my $self = {};
    $self->{filename} = '';
    $self->{writer} = '';
    return bless $self, $class;
}
sub makeTitle {
    my $self = shift;
    my $title = shift;
    $self->{filename} = $title.".html";
    $self->{writer} = FileHandle->new("> $self->{filename}");
    $self->{writer}->print("<html><head><title>$title</title></head><body>\n<h1>$title</h1>\n");
}
sub makeString {
    my $self = shift;
    my $str = shift;
    $self->{writer}->print("<p>$str</p>\n");
}
sub makeItems {
    my $self = shift;
    my $items = shift;
    $self->{writer}->print("<ul>\n");
    for my $i (0..$#{$items}) {
        $self->{writer}->print("<li>$items->[$i]</li>\n");
    }
    $self->{writer}->print("</ul>\n");
}
sub close {
    my $self = shift;
    $self->{writer}->print("</body></html>\n");
    $self->{writer}->close;
}
sub getResult {
    my $self = shift;
    return $self->{filename};
}
1;

Main.pl
use strict;
use warnings;
use Director;
use TextBuilder;
use HTMLBuilder;

my ($args) = @ARGV;
$args = "" if (!defined($args)); 
if ($args eq 'plain') {
    my $TextBuilder = TextBuilder->new;
    my $director = Director->new($TextBuilder);
    $director->construct;
    my $result = $TextBuilder->getResult;
    print $result;
}
elsif ($args eq 'html') {
    my $HTMLBuilder = HTMLBuilder->new;
    my $director = Director->new($HTMLBuilder);
    $director->construct;
    my $filename = $HTMLBuilder->getResult;
    print "$filenameが作成されました。\n";
}
else {
    &usage;
}
sub usage {
    print "Usage: perl Main.pl plain    プレーンテキストで文書作成\n";
    print "Usage: perl Main.pl html     HTMLファイル文書作成\n";
}

実行結果
C:\Documents and Settings\dp\Builder>perl Main.pl plain
===========================
『Greeting』

■朝から昼にかけて

 ・おはようございます。
 ・こんにちは。

■夜に

 ・こんばんは。
 ・おやすみなさい。
 ・さようなら。

==========================
C:\Documents and Settings\dp\Builder>perl Main.pl html
Greeting.htmlが作成されました。

C:\Documents and Settings\dp\Builder>type Greeting.html
<html><head><title>Greeting</title></head><body>
<h1>Greeting</h1>
<p>朝から昼にかけて</p>
<ul>
<li>おはようございます。</li>
<li>こんにちは。</li>
</ul>
<p>夜に</p>
<ul>
<li>こんばんは。</li>
<li>おやすみなさい。</li>
<li>さようなら。</li>
</ul>
</body></html>

尚、本コンテンツは、結城先生の以下の本をかなり参考にしています。

Javaでデザインパターンを勉強したい人には、お勧めのご著書です!

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

◆ おすすめ Perl本

■ 続・初めてのPerl 改訂版

『初めてのPerl』の次ぎに読むと吉です。

結構いいですが・・・、初心者にはちょっと難しいかもです。

■ 結城浩のPerlクイズ

この本には、ちゃいちゃんパパの小話しが載っています(謎)。

ある程度、Perlを理解している人には、たまらない内容になっています。さすが結城先生だな!

結城浩のPerlクイズ

■ 新版Perl言語プログラミングレッスン入門編

実は、私はまだ読んでいませんが、結城先生の本なので良くないはずがありません。

新版Perl言語プログラミングレッスン入門編

■ CGI&Perlポケットリファレンス (Pocket reference)

この本は、非常に役に立ちます。ちょっと調べるのに最適です。サンプルも説明も的を射ています。

CGI&Perlポケットリファレンス (Pocket reference)

■ Perlベストプラクティス

一読の価値有りだと思います。

Perlベストプラクティス

■ プログラミングPerl〈VOLUME1〉

ご存知、Perl本の聖書、ラクダ本(上)です。

■ プログラミングPerl〈VOLUME2〉

ご存知、Perl本の聖書、ラクダ本(下)です。

◆ おわりに

最後に、本ページが、何かのお役に立てれば幸いです。

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ WEBリーダー/ 燈明日記/ yahoo

人のよいところをどんどん見つけよう