- PR -

Singletonって・・・

投稿者投稿内容
goyatan
会議室デビュー日: 2003/04/02
投稿数: 6
投稿日時: 2003-06-20 17:34
Java初心者です
デザインパターンのSingletonパターンについて質問があります。

Singletonパターンはシステムでの共通リソースファイルのアクセスを一元化するために
利用するという認識ですが、
A Singletonパターンにしたがって作成したクラスで、
1つだけ生成されたインスタンスを使用してそのクラスの
インスタンスメソッドにアクセスするのと、

B Singletonパターンを使わずに、staticメソッドのみのクラスにして(インスタンスを作成せずに)staticメソッドにアクセスするのではどう違うのでしょうか?

Bの場合も一元管理できていると思うのですが・・・
そうなるとSingletonパターンの本質が分かりません。

例えばConnectionの取得などはSingletonパターンを使って実装されたりしてますか?
それともstaticですか?

どなたか助言を頂けたら幸いです。
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-06-20 18:52
どうも、Wataです。

確かに多くの場面ではSingletonにせずに、staticメソッドだけの
クラスを作っても同じ動作が得られるでしょう。

それに対して、Sigletonにした場合のメリットとして考えられるのは、
・サブクラスの使用が可能
・場合によっては、インスタンスはひとつとは限らない。
・staticメソッドやstaticフィールドを多用するよりオブジェクト思考チック
などが考えられます。

一つ目は例えば、開発途中などにスタブクラスを使ったり、バージョンアップ時に
継承したクラスに置き換えたり、動的にClass.forName()で取得したクラスを使っ
たり、実は途中までプロキシクラスだったりという事が可能です。

2つめは、Singletonパターンの応用になりますが、getInstance()に引数を持たせて、
それに対応したインスタンスを返したりすることもできます。場合によっては
スレッドローカルにするなんてのもありでしょう。
逆に、staticメソッドで作ったときに、後からインスタンスが複数必要になると
対応が非常に困難になると思います。

3つめはかなり気分の問題ですが、自分にとっては結構重要だったりします。

私が思いつくメリットはこのくらいです。

ちなみに前の開発であったConnectionの管理クラスはSingletonでした。
Singletonにしとけばコネクションの解放にfinalizeで保険をかけとく
こともできますよ。
おっきー
大ベテラン
会議室デビュー日: 2003/05/01
投稿数: 104
投稿日時: 2003-06-20 19:39
インスタンスが唯一でないといけない場合以外は、
staticメソッドでもいいと思います。
Astmild
常連さん
会議室デビュー日: 2003/06/09
投稿数: 30
お住まい・勤務地: 大田区
投稿日時: 2003-06-20 20:16
初めまして。

私もデザインパターン初心者なので間違っていたら恐縮ですが・・・、

Singletonパターンを使用するのは、staticではマルチスレッドに対応できないからです。
一つのスレッドで処理をしている最中、別のスレッドがstaticメソッドの状態を変えて
しまったら入力内容と出力結果に不整合が生じてしまいます。

Webアプリケーション等、不特定多数が同時にアクセスする可能性のあるシステムを構築
する時に使うと効果を発揮すると思います。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2003-06-21 09:56
引用:

Singletonパターンを使用するのは、staticではマルチスレッドに対応できないからです。
一つのスレッドで処理をしている最中、別のスレッドがstaticメソッドの状態を変えて
しまったら入力内容と出力結果に不整合が生じてしまいます。



Singletonパターンなら必ずスレッドセーフにリソースを扱うことができるというのはちょっと違います。たとえばJDBC接続する機能を持ったクラスをSingltonで作ってprepareStatementを使うと、setInt()メソッドなんかをコールするところでsynchronizedなどで排他処理をかけなければいけません。

raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2003-06-22 05:13
引用:


B Singletonパターンを使わずに、staticメソッドのみのクラスにして(インスタンスを作成せずに)staticメソッドにアクセスするのではどう違うのでしょうか?

Bの場合も一元管理できていると思うのですが・・・
そうなるとSingletonパターンの本質が分かりません。



Singletonの本質は 必ずインスタンスは唯一であるということです。
Singletonパターンを使わずに static のみを使った方法でも
同じ結果を期待することはできますが、
new(インスタンスを作成)出来るということ自体に
そのクラスに対する矛盾が発生します。

例えば、コンストラクタで予め10つのコネクションオブジェクトを
作ると仮定します。

もし、間違って 2度 new が走るとコネクションを管理するインスタンスは
2つなり、コネクションオブジェクトの数も20になってしまいますよね。
これではコネクションプールのような管理クラスの役割を果たすことができません。

プログラマが気をつければいい話なのですが、
それさえも禁止?するということもSingletonの特性だと思います。
goyatan
会議室デビュー日: 2003/04/02
投稿数: 6
投稿日時: 2003-06-22 12:43
回答ありがとうございます。
Singletonで実装するほうが、
拡張性や保守性に優れていると感じました。

引用:
例えば、コンストラクタで予め10つのコネクションオブジェクトを
作ると仮定します。

もし、間違って 2度 new が走るとコネクションを管理するインスタンスは
2つなり、コネクションオブジェクトの数も20になってしまいますよね。
これではコネクションプールのような管理クラスの役割を果たすことができません。



raystarさん、回答ありがとうございます。
Connectionの取り方でちょっと疑問点があるのですが、
私の前の開発ではDBのUtilクラスのようなものをつくり
全てstaticメソッドにして取得していたのですが、
当然インスタンスは生成しないので、Connectionの数も意識していないし
また制御することもできないのですが、
この場合はConnectionの数はDB側のシステムファイル
(PostgreSQLではPostgresql.conf)等で制御していたと思います。

SingletonでConnecitonPoolを管理する実装に限って言えば
システムファイルで制御するかjavaのコード上で制御するかの
違いですか?
(すいません、分かりやすい例えをして頂いたのに・・・ちょっと疑問に思ったもので・・・)

回答頂ければ幸いです。
まりり
ぬし
会議室デビュー日: 2001/12/05
投稿数: 329
投稿日時: 2003-06-22 13:06
書いた内容がどこかに飛んでました。すみません。

引用:

Connectionの取り方でちょっと疑問点があるのですが、
私の前の開発ではDBのUtilクラスのようなものをつくり
全てstaticメソッドにして取得していたのですが、
当然インスタンスは生成しないので、Connectionの数も意識していないし
また制御することもできないのですが、
この場合はConnectionの数はDB側のシステムファイル
(PostgreSQLではPostgresql.conf)等で制御していたと思います。

SingletonでConnecitonPoolを管理する実装に限って言えば
システムファイルで制御するかjavaのコード上で制御するかの
違いですか?
(すいません、分かりやすい例えをして頂いたのに・・・ちょっと疑問に思ったもので・・・)



Postgresql.confなどで制御するのは接続数の上限ではないです?

ConenctionPoolでは(結果的に接続数の上限となってしまったとしても)、
目的はConnectionの初期化コストをアプリケーション起動時に寄せることです。

static/Singletonの議論とは直接関係ないかと思いますけれど。

[ メッセージ編集済み 編集者: まりり 編集日時 2003-06-23 10:49 ]

スキルアップ/キャリアアップ(JOB@IT)