シングルトンパターンの実装方法

Singleton-Pattern-Implementation

今日のトピックは「シングルトンパターンの実装」です。シングルトンパターンは、オブジェクト指向設計におけるデザインパターンの一つで、クラスのインスタンスが一つだけであることを保証するために使用されます。このパターンを使うことで、アプリケーション全体で共通のリソースを一元的に管理できます。

目次

基本概念の説明

シングルトンパターン (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++静的メンバー変数とプライベートコンストラクタ高速で効率的、特にリソース制御に強い
Javaprivateコンストラクタとstaticメソッドを使用高い堅牢性とスレッドセーフな実装が可能
JavaScriptクラスとクロージャを使用柔軟でシンプル、フロントエンドやNode.js環境に最適

まとめ

シングルトンパターンは、インスタンスが一つしか存在しないことを保証するための重要なデザインパターンです。これにより、共通リソースの管理が容易になり、プログラムの効率が向上します。次回は「ファクトリーメソッドパターンの実装」について学習しましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次