Perl日記

PerlとかRubyとかPHPとかPythonとか

Singleton

Catalystの勉強絡みでDBIx::Class::Schema::Loaderについて、いろいろしていたら、「シングルトン」という単語に行き当たった。
これまでも見たことはあったけど、後回しにしていて、意味が分からなかったのでようやく調べた。
参考:
Singleton パターン - WikipediaƒTƒ‹‚Å‚à‚í‚©‚é ‹tˆø‚«ƒfƒUƒCƒ“ƒpƒ^[ƒ“@‘æ2Í ‹tˆø‚«ƒJƒ^ƒƒO@ƒƒWƒbƒN•Ò@SingletoniƒVƒ“ƒOƒ‹ƒgƒ“j

要するにクラスから作ることができるインスタンスは一個だけ、グローバル変数的、あるいは、一個だけのキャッシュという感じのデザインパターンのようだ。
そう、デザパタ
でこれまたどっかで見たことあるな、とデザインパターンで引っかかったのだけれど、例のごとくというか、「モダンPerl入門」だった。
理解できなくても頭の隅に残っていて、理解の一端になったと喜ぶべきなのか、それくらい一般常識なんだから覚えておけよ自分、みたいに悲しむべきなのか…。
まあ次に活かせればそれでよいか。

package MySingleton;
my $SINGLETON;
sub new {
  if ($SINGLETON) {
    return $SINGLETON;
  }
  else {
    my $class = shift;
    $SINGLETON = bless { @_ }, $class;
    return $SINGLETON;
  }
}

一度作ったインスタンスはクラス変数として保持、再度コンストラクタが起動されたら、そのクラス変数に保持したインスタンスを返却する。


Moose使ってるなら、MooseX::Singletonをuseするだけ。簡単。