読者です 読者をやめる 読者になる 読者になる

理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

Factory Methodパターン

なんでこれTemplate Methodパターンと分けてんの?
スゲー一緒な気がしたよ。

ところでぼくは前の携帯電話としてD901iを持っていたんですけど、今はSH704iに換えた。
そういうところにインスピレーションを感じて、こんなのを作ってみたよ。
なんかFactory Methodパターンの良い例が全然見つからなくて、最初は携帯電話に適用しようと思ったんですけど、携帯電話の広告に適用することになった。
人生何がおこるかわかりませんね。

なんかこれFactory Methodって呼んでいいの?とか思うんですけど、いいことにします。


プログラムはこんなで、

#!/opt/local/bin/perl
use strict;
use AdPhoneFactory::D901Factory;
use AdPhoneFactory::SH704Factory;

for my $factory (qw(AdPhoneFactory::D901Factory AdPhoneFactory::SH704Factory)) {
  my $ad = $factory->create_advertise( 10000, "kiririmode" );
  $ad->advertise();
  print "広告終わり\n\n";
}

実行結果はこんな感じです。

おまえら!この携帯すごいぞ!
	カメラが2Mピクセル!
	スライド携帯だー
	FOMA!FOMA!
で、値段とか10000円だ!買え!
---この広告はkiririmodeに承認されているのでした---
広告終わり

おまえら!この携帯すごいぞ!
	ワンセグついた!
	おサイフ携帯ですよ
	ウスい!!
で、値段とか10000円だ!買え!
kiririmodeなんです
広告終わり

Factoryを担当してもらいますAdPhoneFactory.pmは下のような感じ。
createで全然なにもやってないんですけど、なんか実行する処理ないかなーとかスゲー考えた。考えたけど出てこなかったので、もういい。

package AdPhoneFactory;
use Ad;

sub new { die }

sub create {
  my $self = shift;
  my $ad = $self->create_advertise( @_ );
}

sub create_advertise{ die }
1;

AdPhoneFactoryは広告を作るんですけど、大まかなヤツはこいつで作っておくことにした。
authorityは、広告を受理するエラい人という位置づけ。
return undefしてるのは、このクラスが純粋仮想クラスっぽく振る舞ってくれるように祈るため。

package Ad;

sub new { 
  my ($class, $price, $authority) = @_;
  return undef if __PACKAGE__ eq $class;
  return bless { price => $price, authority => $authority }, $class;
}

sub advertise { 
  my $self = shift;
  print "おまえら!この携帯すごいぞ!\n";
  print map { "\t$_\n" } $self->selling_point();
  print "で、値段とか", $self->get_price(), "円だ!買え!\n";
  print $self->approve(), "\n";
}

sub selling_point { die }
sub approve { die }
sub get_price { shift->{price} }
sub get_authority { shift->{authority} }

1;

あとは、D901i、SH704iそれぞれのFactoryと広告。
D901Factory.pm

package AdPhoneFactory::D901Factory;
use Ad::D901;
use base 'AdPhoneFactory';

sub create_advertise {
  return Ad::D901->new( @_[1,2] );
}

1;

SH704Factory.pm

package AdPhoneFactory::SH704Factory;
use Ad::SH704i;
use base 'AdPhoneFactory';

sub create_advertise {
  return Ad::SH704i->new( @_[1,2] );
}

1;

D901.pm

package Ad::D901;
use base 'Ad';

sub selling_point {
  qw(カメラが2Mピクセル! スライド携帯だー FOMA!FOMA!);
}

sub approve {
  my $self = shift;
  return "---この広告は" . $self->get_authority() . "に承認されているのでした---";
}

1;

SH901.pm

package Ad::SH704i;
use base 'Ad';

sub selling_point {
  qw(ワンセグついた! おサイフ携帯ですよ ウスい!!);
}

sub approve {
  my $self = shift;
  return $self->get_authority() . "なんです";
}

1;