Singleton

[PHP] : Singleton

Singletonパターン

1 外部からインスタンスを生成させない
2 インスタンスをひとつだけ生成を許す
ということを実現するデザインパターン

Singletonクラス



class singleton {
private static $instance_ = null;
private function __construct() {
    echo "make instance \n";
}   

public static function getInstance() {
    if( is_null( self::$instance_ ) ) { 
        self::$instance_ = new singleton();
    }   
    return self::$instance_;
}   

}

client

外部のclientからnewをしようとするとerrorになる。
インスタンスを取得する場合はクラスメソッドのgetInstance()を利用する。



//error
$instance = new singleton(); //ここはエラーになる。

//success
$instance = singleton::getInstance();

PHPのvalidate処理実装

validate処理

  • frameworkには必ずといっていいほど含まれているvalidate処理。独自に簡単な処理を書いてみた。
  • validateは処理の型が決まっているので、interfaceを用意し、個別のvalidateクラスを実装する。

interface

validateのinterfaceを定義


interface Validate {
public function execute( $param, $format );
}

各validate処理

interfaceで定義したexecuteメソッドの本実装を行う。ここではStirng,Length,Regexを定義するが同様にクラスを追加すれば簡単にvalidateが実装できる。


class StringValidate implements Validate {
public function execute( $param, $flag ) {
if( is_string( $param ) !== $flag ) {
    return false;
}
return true;
}

}

class LengthValidate implements Validate {
public function execute( $param , $length ) {
if( mb_strlen( $param ) > $length ) {
    return false;
}
return true;
}
}

class RegexValidate implements Validate {
public function execute( $param , $regex ) {
if( !preg_match( $regex, $param ) ) {
    return false;
}
return true;
}
}

validateManager

clientから呼び出され、各validateのexecuteメソッドを呼び出す。


class ValidateManager {

static private $params_ = array();

static public function init() {
//本来はここで$_POSTなどから取得する
self::$params_ = array( 'aaaa' => 'sampletest' );
}

static public function execute( $form ) {
self::init();
foreach( $form as $key => $valide ) {
    foreach( $valide as $type => $format ) {
        $class = ucfirst( $type ) . 'Validate';
        $value = self::$params_[ $key ];
        $result = $class::execute( $value, $format );
        if( $result === false ) {
            echo "ERROR $type \n";
            return false;
        }
    }
}
return true;
}

}

clientプログラム

必要なvalidateの定義を行ない、validateManagerクラスに渡す。validateの定義を配列で行っているが設定ファイルから呼び出す方針に変更も可能。


//client
$form = array( 'aaaa' => array( 'String' => TRUE,
                        'Length' => 15,
                        'Regex' => '/\w.*/i' ) );

// 実行
$stat = ValidateManager::execute( $form );

if( $stat ) {
echo "TRUE \n";
} else {
echo "FALSE \n";
}