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さんどうもです。