OSSのデザインパターン解説シリーズ:Singletonパターンの活用と悪いコード例
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. 参考文献
- Java言語で学ぶデザインパターン入門第3版 結城 浩 SBクリエイティブ
- JDKソースコード
3. System クラス
Discussion