singletonとstaticクラスの違い

ちょっとしたきっかけで考えることになったので自分の考えを書いてみる。

まずはsingletonとstaticクラスの実装を書いてみる。
PHPで書いてます。
基本的にPHPだとリクエスト内でしかオブジェクトが1つであることを保証できないから、
微妙な感じはするけど・・・。
Javaとかで書いた方がしっくりくるな・・・。

singletonの実装

<?php
class Singleton {

	private static $instance = null;

	private $name = '';

	private function  __construct(){
	}

	public function createInstance(){
		if($this->instance === null){
			$this->instance = new Singleton();
		}
		return $this->instance;
	}

	public function setName($name){
		$this->name = $name;
	}
}

staticクラスの実装

<?php
class StaticClass {

	private static $name = '';

	private function  __construct(){
	}

	public function setName($name){
		$this->name = $name;
	}
}

上記のsingletonとstaticクラスは同じことをしていると思う。
手段は違えど、$nameを共有するという目的は果たしているイメージ。


で、どちらがいいのか?


個人的にはsingletonが好き。
singletonの利点だと思っているのは以下。

1.「singleton」という単語で相手に実装を説明できる。
staticクラスよりは説明しやすい気がする。

2.multitonに拡張することができる。
仕様変更とか設計方針の変更によってsingletonをmultitonに変更することがあると思うので、
singletonの方がいいかなと・・・。

3.createInstance() でインスタンスの初期化処理を実行することができる。
以下の setUser() のように初期化処理を書ける。

<?php
public function createInstance(){
	if($this->instance === null){
		$this->instance = new Singleton();
		$this->instance->setUser(new DefaultUser());
	}
	return $this->instance;
}

4.オブジェクト指向っぽくなる。
個人的にオブジェクト指向はオブジェクトを操作することでビジネスロジックを表現するものだと思っている。
singletonは「このオブジェクトは1つしか存在しません」という実装で、
createInstance()と自分自身のインスタンス以外は全てstaticではないから、「オブジェクトを操作している」「状態を持っている」イメージが強い。

<?php
$singleton = Singleton::createInstance();
$singleton->setName('my_name');

でも、staticクラスの場合はオブジェクトではなく、staticな変数、メソッドなので、こういったイメージが弱い気がする。
静的なアクセスになるので個人的に「状態を持っていない」イメージを強く感じでしまい、違和感がある。

<?php
Singleton::setName('my_name'); //なんとなく違和感・・・。

staticクラスは状態を持たないユーティリティ系クラスのイメージが強い。
JavaのMathとか。


以上で説明は終わりです。


プログラムは難しいな・・・。