💭

OSSのデザインパターン解説シリーズ:Singletonパターンの活用と悪いコード例

2024/06/17に公開

1. はじめに

このシリーズでは、オープンソースソフトウェア(OSS)のソースコードを通じて、GoF(Gang of Four)デザインパターンの活用方法を解説します。
特に悪い例と良い例を見ることで、デザインパターンのメリットを考えていきます。

なお、OSSやデザインパターンの詳しい解説は書きません。
最小限のコード例と解説を書いていきます。

2. Singletonパターンとは

Singletonパターンとは、"一つしか存在しないもの"を表現するためのパターンです。
特に、インスタンスが複数存在すると問題ある場合に有効なパターンです。

Javaでは、以下の標準入出力においてSingletonパターンが使われています。

  • System.out
  • System.in

3. デザインパターンの適用

以下は、Singletonパターンの実装例です。

Systemクラスに標準入出力のインスタンス in, out を一つだけ(クラス変数として)保存しています。そして、使う側は in, out を呼び出して、そのインスタンスメソッドを利用することができます。

public class System {
  public static final InputStream in;
  public static final PrintStream out;
  static {
    //in, outの初期化
  }
  //Systemクラスの実装
}

一方、使う側のコードは以下のようになります。

public class Main{
  public static void main(String... args){
    //標準出力
    System.out.println("print by out");

    //標準入力
    //バイトの読み込みしかできないので、通常はScannerクラスも利用する
    int byte = System.in.read();
  }
}

4. 悪いコード例 ~Singletonパターン vs staticクラス~

実は、staticを多用することで"一つしか存在しないもの"を表現することができます。

public class Singleton{
  //すべてクラスメソッドを実装する
  private static String variable;
  public static void method(){
    //実装
  }
}

クラス変数やクラスメソッドは、クラスに"固有"なので一つしかありません。
つまり、"一つしか存在しないもの"を表現することができるのです。

では、どちらがよいか?という話ですが(賛否が分かれるようですが)
Singletonパターンの良い所は、以下だと考えています:

  • 継承やインターフェースが使える
    • staticを付ける場合、継承ができません。
  • オブジェクト指向の思想に合っている ※かなり感覚的なものです
    • オブジェクト指向では
      • クラスからインスタンスを生成する
      • インスタンスが"状態"を保持する

5. Singletonパターンの補足

一般的には getInstance() を使う

今回は、Systemクラスのpublicなクラス変数として in, out を保持していました。

一般的には、Singletonパターンは説明のような説明がされます:

  • 以下のクラス変数・クラスメソッドを用意する
    • instance :クラス変数。唯一のインスタンスを保持する。
    • getInstance() :クラスメソッド。唯一のインスタンスを取得するためのメソッド。
  • その他は、すべてインスタンスメソッドで表現する
public class Singleton{
  private static instance = new Singleton();
  public static Singleton getInstance(){
    return instance;
  }

  //そのほかのインスタンス変数・インスタンスメソッドを実装する
  private String variable;
  public void method(){
    //実装
  }
}

ただし、Singletonパターンは"一つしか存在しないもの"を表現するためのパターンです。
その意味では、Systemクラスの in, out もSingletonパターンの一つと考えられます。

6. デザインパターン適用のメリット

Singletonパターンを使うことで、"一つしか存在しないもの"を表現することができます。

今回の例では、標準入出力は一つしかないので、Singletonパターンの出番です。

7. まとめ

今回はSingletorパターンを利用する/しない場合のコードを基に、Singletonパターンのメリットを考えました。

8. 参考文献

  1. Java言語で学ぶデザインパターン入門第3版 結城 浩 SBクリエイティブ
  2. JDKソースコード
    3. System クラス

Discussion