Perlでシングルトンパターン! (デザインパターン)
一般的なシングルトンパターンのクラス図
+---------------------+ | Singleton | +---------------------+ | -$singleton | +---------------------+ | | | +getInstance | | | +---------------------+
サンプル1
Singleton.pm
package Singleton; use strict; my $singleton; BEGIN { print "Start.\n"; $singleton = bless {}, __PACKAGE__; print "インスタンスを生成しました。\n"; } sub getInstance { return $singleton; } 1;
Main.pl
use strict; use Singleton; my $obj1 = Singleton->getInstance; my $obj2 = Singleton->getInstance; if ($obj1 eq $obj2) { print '$obj1と$obj2は同じインスタンスです。', "\n"; } else { print '$obj1と$obj2は同じインスタンスではありません。', "\n"; } print "End.\n";
Main.plの実行結果
C:\Documents and Settings\dp\Singleton>perl main.pl Start. インスタンスを生成しました。 $obj1と$obj2は同じインスタンスです。 End.
サンプル2
チケット発行などで、ユニークでシーケンシャルな番号を発行したい場合、シングルトンパターン適用が有効です。
以下に、適用しないケースと適用したケースを示します。
Main.pl
use strict; use TicketMaker; my $obj1 = TicketMaker->getInstance; my $obj2 = TicketMaker->getInstance; print $obj1->getNextTicketNumber, "\n"; print $obj1->getNextTicketNumber, "\n"; print $obj2->getNextTicketNumber, "\n"; print $obj2->getNextTicketNumber, "\n";
TicketMaker.pm(適用しないケース:複数インスタンスが可能)
package TicketMaker; use strict; sub getInstance { my $class = shift; my $self = {}; $self->{ticket} = 1000; return bless $self, $class; } sub getNextTicketNumber { my $self = shift; return $self->{ticket}++; } 1;
C:\Documents and Settings\dp\Singleton>perl Main.pl 1000 1001 1000 1001
同じ番号のチケットが発行されてしまった。
TicketMaker.pm(シングルトンパターンを適用したケース)
package TicketMaker; use strict; my $singleton; BEGIN { my $self = {}; $self->{ticket} = 1000; $singleton = bless $self, __PACKAGE__; } sub getInstance { return $singleton; } sub getNextTicketNumber { my $self = shift; return $self->{ticket}++; } 1;
C:\Documents and Settings\dp\Singleton>perl Main.pl 1000 1001 1002 1003
ユニークでシーケンシャルな番号のチケットが発行された。
尚、本コンテンツは、結城先生の以下の本をかなり参考にしています。
Javaでデザインパターンを勉強したい人には、お勧めのご著書です!
- 作者: 結城浩
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2004/06/19
- メディア: 大型本
- 購入: 51人 クリック: 762回
- この商品を含むブログ (400件) を見る