オブジェクト指向プログラミングなんかで使われる設計パターンに、デザインパターンというものがあります。
数々のエンジニアが工夫を重ねてきた設計が23種類ほどあり、その中の1つにシングルトンパターンというデザインパターンがあります。
データベース接続する際などに使うシングルトンパターンについて、今回はまとめていきます。
シングルトンパターンの基本概念
シングルトンパターンは、ソフトウェア開発において、特定のクラスのインスタンスが1つだけであることを保証するデザインパターンです。
これにより、特定のリソースや設定がグローバルに一貫して管理されることを可能にします。
このパターンは特にデータベース接続や設定ファイルの読み込み、ログの管理などで有用です。
シングルトンパターンの目的
シングルトンパターンの目的としては以下のようなものが挙げられます。
- クラスのインスタンスが一つだけであることを保証
- この唯一のインスタンスにグローバルにアクセスできる
シングルトンパターンの特徴
目的を達成するために、シングルトンクラスは以下のような特徴を持ちます。
プライベートなコンストラクタ
クラスの外部からインスタンスが作成されないようにするため。
静的なインスタンス
クラス内で唯一のインスタンスを保持。
静的なメソッド
インスタンスへのアクセスを提供する。
シングルトンパターンをPHPで実装
具体的にデータベース接続を例として、PHPでシングルトンパターンを実装してみます。
<?php
class Database {
// 唯一のインスタンスを保持するためのプライベート静的プロパティ
private static $instance = null;
// データベース接続を保持するプロパティ
private $connection;
// コンストラクタはプライベートにして外部からのインスタンス化を防ぐ
private function __construct() {
$host = 'localhost';
$dbname = 'my_database';
$username = 'myname';
$password = 'abc123';
try {
$this->connection = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
}
// 唯一のインスタンスを取得するための静的メソッド
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
// データベース接続を取得するメソッド
public function getConnection() {
return $this->connection;
}
// クローンメソッドはプライベートにしてクローン化を防ぐ
private function __clone() {}
// シリアライズメソッドはプライベートにしてシリアライズを防ぐ
private function __wakeup() {}
}
// データベース接続の取得例
$db = Database::getInstance();
$connection = $db->getConnection();
// クエリの実行例
$stmt = $connection->prepare("SELECT * FROM users");
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($results as $row) {
echo $row['name'] . "<br>";
}
?>
ポイント
1.プライベートコンストラクタ
‘private function __construct()’ は外部から直接インスタンス化することを防ぎます。
2.静的プロパティ
‘private static $instance = null’はクラス内で唯一のインスタンスを保持します。
3.静的メソッド
‘public static function getInstance()’は唯一のインスタンスを返すためのメソッドです。
インスタンスがまだ作成されていない場合、このメソッドは新しいインスタンスを作成し、以降はそのインスタンスを返します。
4.データベース接続の管理
‘private $connection’は、PDOを使ってデータベース接続を保持します。
これにより、同じ接続を複数の場所で使うことができます。
シングルトンパターンの利点
シングルトンパターンの利点は以下のような点が挙げられます。
一貫性のあるデータ管理
例えば、データベース接続をシングルトンとして管理することで、アプリケーション全体で一貫性のある接続を行えます。
リソースの節約
複数のデータベース接続を開くのではなく、1つの接続を使いまわすことでリソースを節約できます。
グローバルアクセス
インスタンスにグローバルにアクセスできるため、コードがシンプルになります。
注意点
テストの難しさ
シングルトンパターンはテストが難しい場合があります。
なぜなら、グローバルな状態を持つため、テスト間で状態が共有されてしまうことがあるからです。
柔軟性の欠如
シングルトンパターンを使うと、そのクラスのインスタンスは1つの限定されるので、状況によっては柔軟性が失われることがあります。
まとめ
シングルトンパターンは、特定のクラスのインスタンスが1つだけであることを保証し、グローバルにアクセスできるようにする強力なデザインパターンです。
今回紹介したデータベース接続だけでなく、多くの場面で使用でき有用ですが、使い方に注意も必要です。
適切に使用することで、コードの一貫性や効率も上がるのでぜひ身に付けたい技術です。
こういったデザインパターンが他にも色々あるので、別の記事で紹介します。
PHPのクラスについてさらに詳しく知りたい方はこちら。