Perlでファクトリメソッドパターン! (デザインパターン)

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

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

◆ はじめに

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

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

それは、

です。

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

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

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

◆ サイト最新情報

◆ コンテンツ

2008-02-26 Perlでファクトリメソッドパターン! (デザインパターン)

Perlでデザインパターン 第4弾(ファクトリメソッドパターン)

ファクトリメソッドパターンとは、スーパークラスで処理の枠組みを定め、サブクラスでその具体的内容を定めるようなデザインパターンです。

なんだ、テンプレートメソッドパターンと同じじゃないか・・・と思ったあなた、さすがです。

だた違うのは、ファクトリメソッドパターンでは、抽象的なインスタンスを作成します。

そして、サブクラスで具象的なインスタンスを実装するのです。


以下のクラス図で示されているようにCreatorクラスのcreateメソッドで抽象メソッドfactoryMethodを利用して抽象的なインスタンスを作成します。

つぎに、具象クラスConreteCreatorでfactoryMethodをオーバーライドします。そのfactoryMethodには、Productクラスを継承したConreteProductオブジェクトが渡されるのです。


ファクトリメソッドパターンとは、抽象クラス(CreatorとProduct)で処理の枠組み(フレームワーク)定め、具象クラス(ConreteCreatorとConreteProduct)具体的な肉付けをするパターンです。


注目すべきは、抽象クラスには一切具象クラスが出て来ないことです。つまり、具象レベルがどのような実装になってもこのフレームワーク(抽象クラス)が使えるということです。


一般的なファクトリメソッドパターンのクラス図
     +---------------------+  Creates    +---------------------+                    
     |  Creator            |------------>| Product             |                    
     +---------------------+             +---------------------+                    
     |                     |             |                     |                    
     +---------------------+             +---------------------+                    
     |  create             |             |  method1            |                    
     |  factoryMethod      |             |  method2            |                    
     |                     |             |  method3            |                    
     |                     |             |                     |                    
     +---------------------+             +---------------------+                    
                #                                   #                               
                |                                   |                               
                |                                   |                               
                |                                   |                               
     +----------+----------+  Creates    +----------+----------+                    
     | ConreteCreator      |------------>| ConreteProduct      |                    
     +---------------------+             +---------------------+                    
     |                     |             |                     |                    
     +---------------------+             +---------------------+                    
     | factoryMethod       |             | method1             |                    
     |                     |             | method2             |                    
     |                     |             | method3             |                    
     +---------------------+             +---------------------+                    

サンプル

IDカードを作るサンプルです。

詳しくは、『増補改訂版Java言語で学ぶデザインパターン入門』に書かれています。


サンプルのクラス図
     +---------------------+  Creates    +---------------------+                    
     | Factory             |------------>| Product             |                    
     +---------------------+             +---------------------+                    
     |                     |             |                     |                    
     +---------------------+             +---------------------+                    
     |  create             |             |  use                |                    
     |  createProduct      |             |                     |                    
     |  registerProduct    |             |                     |                    
     |                     |             |                     |                    
     +---------------------+             +---------------------+                    
                #                                   #                               
                |                                   |                               
                |                                   |                               
                |                                   |                               
     +----------+----------+  Creates    +----------+----------+                    
     | IDCardFactory       |------------>| IDCard              |                    
     +---------------------+             +---------------------+                    
     | owners              |             | owner               |
     +---------------------+             +---------------------+                    
     | createProduct       |             | use                 |                    
     | registerProduct     |             | getOwner            |                    
     +---------------------+             +---------------------+                    
Product.pm
package Product;
use strict;

sub use { die "オーバーライド必須"; }
1;
Factory.pm
package Factory;
use strict;

sub create {
    my $self = shift;
    my $owner = shift;
    my $p = $self->createProduct($owner);
    $self->registerProduct($p);
    return $p;
}
sub createProduct { die "オーバーライド必須"; }
sub registerProduct { die "オーバーライド必須"; }
1;
IDCard.pm
package IDCard;
use strict;
use base 'Product';

sub new {
    my $class = shift;
    my $self = {};
    $self->{owner} = shift;
    print "$self->{owner}のカードを作ります。\n";
    return bless $self, $class;
}
sub use {
    my $self = shift;
    print "$self->{owner}のカードを使います。\n";
}
sub getOwner {
    my $self = shift;
    return $self->{owner};
}
1;
IDCardFactory.pm
package IDCardFactory;
use strict;
use IDCard;
use base 'Factory';

sub new {
    my $class = shift;
    my $self = {};
    $self->{owners} = [];
    return bless $self, $class;
}
sub createProduct {
    my $self = shift;
    my $owner = shift;
    return IDCard->new($owner);
}
sub registerProduct {
    my $self = shift;
    my $product = shift;
    push @{$self->{owners}}, $product->getOwner();
}
1;
Main.pl
use strict;
use IDCardFactory;

my $factory = IDCardFactory->new;
my $card1 = $factory->create('まちゃ');
my $card2 = $factory->create('やちゅ');
my $card3 = $factory->create('ヒロ');
$card1->use();
$card2->use();
$card3->use();
Main.plの実行結果
C:\Documents and Settings\dp\FactoryMethod>perl main.pl
まちゃのカードを作ります。
やちゅのカードを作ります。
ヒロのカードを作ります。
まちゃのカードを使います。
やちゅのカードを使います。
ヒロのカードを使います。

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

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

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