- - PR -
Singletonって・・・
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2003-06-20 17:34
Java初心者です
デザインパターンのSingletonパターンについて質問があります。 Singletonパターンはシステムでの共通リソースファイルのアクセスを一元化するために 利用するという認識ですが、 A Singletonパターンにしたがって作成したクラスで、 1つだけ生成されたインスタンスを使用してそのクラスの インスタンスメソッドにアクセスするのと、 B Singletonパターンを使わずに、staticメソッドのみのクラスにして(インスタンスを作成せずに)staticメソッドにアクセスするのではどう違うのでしょうか? Bの場合も一元管理できていると思うのですが・・・ そうなるとSingletonパターンの本質が分かりません。 例えばConnectionの取得などはSingletonパターンを使って実装されたりしてますか? それともstaticですか? どなたか助言を頂けたら幸いです。 | ||||
|
投稿日時: 2003-06-20 18:52
どうも、Wataです。
確かに多くの場面ではSingletonにせずに、staticメソッドだけの クラスを作っても同じ動作が得られるでしょう。 それに対して、Sigletonにした場合のメリットとして考えられるのは、 ・サブクラスの使用が可能 ・場合によっては、インスタンスはひとつとは限らない。 ・staticメソッドやstaticフィールドを多用するよりオブジェクト思考チック などが考えられます。 一つ目は例えば、開発途中などにスタブクラスを使ったり、バージョンアップ時に 継承したクラスに置き換えたり、動的にClass.forName()で取得したクラスを使っ たり、実は途中までプロキシクラスだったりという事が可能です。 2つめは、Singletonパターンの応用になりますが、getInstance()に引数を持たせて、 それに対応したインスタンスを返したりすることもできます。場合によっては スレッドローカルにするなんてのもありでしょう。 逆に、staticメソッドで作ったときに、後からインスタンスが複数必要になると 対応が非常に困難になると思います。 3つめはかなり気分の問題ですが、自分にとっては結構重要だったりします。 私が思いつくメリットはこのくらいです。 ちなみに前の開発であったConnectionの管理クラスはSingletonでした。 Singletonにしとけばコネクションの解放にfinalizeで保険をかけとく こともできますよ。 | ||||
|
投稿日時: 2003-06-20 19:39
インスタンスが唯一でないといけない場合以外は、
staticメソッドでもいいと思います。 | ||||
|
投稿日時: 2003-06-20 20:16
初めまして。
私もデザインパターン初心者なので間違っていたら恐縮ですが・・・、 Singletonパターンを使用するのは、staticではマルチスレッドに対応できないからです。 一つのスレッドで処理をしている最中、別のスレッドがstaticメソッドの状態を変えて しまったら入力内容と出力結果に不整合が生じてしまいます。 Webアプリケーション等、不特定多数が同時にアクセスする可能性のあるシステムを構築 する時に使うと効果を発揮すると思います。 | ||||
|
投稿日時: 2003-06-21 09:56
Singletonパターンなら必ずスレッドセーフにリソースを扱うことができるというのはちょっと違います。たとえばJDBC接続する機能を持ったクラスをSingltonで作ってprepareStatementを使うと、setInt()メソッドなんかをコールするところでsynchronizedなどで排他処理をかけなければいけません。 | ||||
|
投稿日時: 2003-06-22 05:13
Singletonの本質は 必ずインスタンスは唯一であるということです。 Singletonパターンを使わずに static のみを使った方法でも 同じ結果を期待することはできますが、 new(インスタンスを作成)出来るということ自体に そのクラスに対する矛盾が発生します。 例えば、コンストラクタで予め10つのコネクションオブジェクトを 作ると仮定します。 もし、間違って 2度 new が走るとコネクションを管理するインスタンスは 2つなり、コネクションオブジェクトの数も20になってしまいますよね。 これではコネクションプールのような管理クラスの役割を果たすことができません。 プログラマが気をつければいい話なのですが、 それさえも禁止?するということもSingletonの特性だと思います。 | ||||
|
投稿日時: 2003-06-22 12:43
回答ありがとうございます。
Singletonで実装するほうが、 拡張性や保守性に優れていると感じました。
raystarさん、回答ありがとうございます。 Connectionの取り方でちょっと疑問点があるのですが、 私の前の開発ではDBのUtilクラスのようなものをつくり 全てstaticメソッドにして取得していたのですが、 当然インスタンスは生成しないので、Connectionの数も意識していないし また制御することもできないのですが、 この場合はConnectionの数はDB側のシステムファイル (PostgreSQLではPostgresql.conf)等で制御していたと思います。 SingletonでConnecitonPoolを管理する実装に限って言えば システムファイルで制御するかjavaのコード上で制御するかの 違いですか? (すいません、分かりやすい例えをして頂いたのに・・・ちょっと疑問に思ったもので・・・) 回答頂ければ幸いです。 | ||||
|
投稿日時: 2003-06-22 13:06
書いた内容がどこかに飛んでました。すみません。
Postgresql.confなどで制御するのは接続数の上限ではないです? ConenctionPoolでは(結果的に接続数の上限となってしまったとしても)、 目的はConnectionの初期化コストをアプリケーション起動時に寄せることです。 static/Singletonの議論とは直接関係ないかと思いますけれど。 [ メッセージ編集済み 編集者: まりり 編集日時 2003-06-23 10:49 ] | ||||
