デザインパターンをがんばって書いてみる。JavaとPerlを行き来しつつ。
Singleton :: インスタンスを1個だけに限定するデザインパターン。「そのクラスから生成されるインスタンスは1個だけしかない」という確実な保証をすることが大事だとか。
結城さんの本を参考に(というか丸写し・・・)Javaで書くと
public class Singleton { private static Singleton singleton =new Singleton(); private Singleton(){ System.out.println("インスタンスを生成しました"); } public static Singleton getInstance(){ return singleton; } }
こんな風になる。生成するインスタンスをprivateにすることで、外部からイタズラできないようにする。コンストラクタはメッセージを応答するだけ。getInstance()はインスタンスを返すクライアント側はこんな感じにするらしい↓
public class Main { public static void main (String[] args){ System.out.println("start"); Singleton obj1 = Singleton.getInstance(); Singleton obj2 = Singleton.getInstance(); if(obj1 == obj2){ System.out.println("obj1とobj2は同じインスタンスです"); }else { System.out.println("obj1とobj2は違うインスタンスです"); } System.out.println("End"); } }
Singleton.getInstance()する前に
private static Singleton singleton =new Singleton();
が呼び出されてインスタンスが保持されるとのこと。この呼び出しのメカニズムがよくわかんないや。
んでPerlだとどうなるかというと
http://perldesignpatterns.com/?SingletonPattern
を参考に書くと
package Singleton; use strict; my $singleton; sub getInstance{ if(! $singleton){ my $class = shift; $singleton = bless {} => $class; }else{ return $singleton; } } 1;
クライアントは
use Singleton; my $child = Singleton->getInstance(); my $child2 = Singleton->getInstance(); if($child == $child2){ print "同じインスタンスですよ?n"; }else{ print "違うインスタンスですよ?n"; } exit;
のようになりました。
宙に浮いたような$singletonがなんか気持ち悪い。getInstanceメソッドを呼び出すとき、インスタンスが生成されていない場合はコンストラクトして$singletonに突っ込む。既にインスタンスが生成されていた場合は$singleton(インスタンス)を返す。
他にもうまいやり方がありそうな気がします。