今日のトピックは「シングルトンパターンの実装」です。シングルトンパターンは、オブジェクト指向設計におけるデザインパターンの一つで、クラスのインスタンスが一つだけであることを保証するために使用されます。このパターンを使うことで、アプリケーション全体で共通のリソースを一元的に管理できます。
目次
基本概念の説明
シングルトンパターン (Singleton Pattern)
シングルトンパターンは、特定のクラスがインスタンスを一つしか持たないことを保証するデザインパターンです。これにより、グローバルにアクセス可能なインスタンスを提供し、必要なリソースや設定を集中管理できます。
各言語でのサンプルコード
Python
class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
# 使用例
singleton1 = Singleton()
singleton2 = Singleton()
print(singleton1 is singleton2) # True
C#
public class Singleton {
private static Singleton _instance = null;
private static readonly object _lock = new object();
private Singleton() {}
public static Singleton Instance {
get {
lock (_lock) {
if (_instance == null) {
_instance = new Singleton();
}
return _instance;
}
}
}
}
// 使用例
Singleton singleton1 = Singleton.Instance;
Singleton singleton2 = Singleton.Instance;
Console.WriteLine(singleton1 == singleton2); // True
C++
#include <iostream>
class Singleton {
private:
static Singleton* instance;
Singleton() {}
public:
static Singleton* getInstance() {
if (!instance) {
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = nullptr;
// 使用例
int main() {
Singleton* singleton1 = Singleton::getInstance();
Singleton* singleton2 = Singleton::getInstance();
std::cout << (singleton1 == singleton2) << std::endl; // 1 (True)
}
Java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
// 使用例
public class Main {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton1 == singleton2); // True
}
}
JavaScript
class Singleton {
constructor() {
if (Singleton.instance) {
return Singleton.instance;
}
Singleton.instance = this;
}
}
// 使用例
const singleton1 = new Singleton();
const singleton2 = new Singleton();
console.log(singleton1 === singleton2); // True
各言語の解説
言語 | シングルトンの実装方法 | 特徴 |
---|---|---|
Python | __new__ メソッドをオーバーライド | シンプルで柔軟、特にメタクラスを使うと高度な制御が可能 |
C# | static キーワードとロックオブジェクトを使用 | スレッドセーフで強力な機能を持つ |
C++ | 静的メンバー変数とプライベートコンストラクタ | 高速で効率的、特にリソース制御に強い |
Java | private コンストラクタとstatic メソッドを使用 | 高い堅牢性とスレッドセーフな実装が可能 |
JavaScript | クラスとクロージャを使用 | 柔軟でシンプル、フロントエンドやNode.js環境に最適 |
まとめ
シングルトンパターンは、インスタンスが一つしか存在しないことを保証するための重要なデザインパターンです。これにより、共通リソースの管理が容易になり、プログラムの効率が向上します。次回は「ファクトリーメソッドパターンの実装」について学習しましょう。
コメント