Singleton
使い回しが効くオブジェクトは毎回 new せずに static にする。
コンストラクタを private にする。
public class SingletonSample { /** 唯一のインスタンス */ private static SingletonSample instance = new SingletonSample(); /** コンストラクタは何もしない */ private SingletonSample(){} /** インスタンスの取得 */ public static SingletonSample getInstance(){ return instance; } /* 以下 処理 */ public int otherFunction(){ } }
Factoryクラス等で利用。
PHP4で書くと
$SingletonSample_instance = & new SingletonSample(); class SingletonSample { /** このクラスのインスタンスを返す */ function getInstance(){ return $GLOBALS['SingletonSample_instance']; } /** 以下 処理 */ function updateDB(){ print 'DB操作など'; } } function main(){ // 使い方 $sample = SingletonSample::getInstance(); $sample->updateDB(); }
private と static が使えないって痛いな。。
これって速くなるんだろうか?
foreachで速度測定っていうくらい頻繁に使うもんでもないよね。
今あるコードでリファクタリングしてみるかなぁ。
取り敢えず上のコードのupdateDB()をpg_connect()に変えてmain()を1000回実行してみる。ループに入る前にpg_connect()を1回呼んでおいて最初の接続にかかる時間を省く。
- 0.009951秒 : getInstance()
- 0.008053秒 : 普通に new
なんで??クラスが小さいから??
それとも自動的に最適化されてるの?
取り敢えずPHP4では無駄に足掻くなってことですか…。
まぁこのクラスが毎回同じファイル/DBにアクセスするとか同じデータを使う場合は有効なんだろう。ってことで。
# 追記
staticって使えましたね…id:kunitさんどうもです。