- PR -

ユーティリティクラスをSingletonにしたときのデメリット

投稿者投稿内容
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-06-24 19:42
Singletoneのメリットは言われている通り
だとは思いますが、私は個人的に使い分け
は以下のような観点で行ってますね。

・Utility的クラスはstaticクラス
・Factory的クラスはSingletone

Utilityクラスでいちいちインスタンス取得
するためにHoge.getInstance()とか面倒です
しね。
aa
ぬし
会議室デビュー日: 2004/01/08
投稿数: 299
投稿日時: 2005-06-24 20:51
拡張しようとしまいとユーティリティにシングルトンという発想自体が私にはないですし、使いたくもないです。シングルトンは数を制御したいためのデザインパターンですから。

シングルトンの活用事例としては、コネクションプーリングがよくあがりますね。

でも、そもそもあなたと私でユーティリティの定義が違うのかもしれません。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-06-24 23:16
public staticなメソッドであればstatic importが利用できるので、今では特別な理由がない限りはstaticなんでしょうね。
torakiyojp
常連さん
会議室デビュー日: 2004/08/04
投稿数: 23
投稿日時: 2005-06-25 00:18
引用:

YUKIJPさんの書き込み (2005-06-24 19:16) より:
Singletonであれば拡張性があるのがメリットかと思いましたが
他の方意見を伺いたいと思いました。



はじめに、回答ではありません。ごめんなさい。

私の勉強不足です。
理解できません。

拡張と聞くと、継承を使った拡張を想像してしまいます。
Singletonで作ったクラスのコンストラクタはprivateですよね。
そうすると、継承は使えないと思うのですが・・・

Singletonで作ったクラスの拡張性とは、どんな点でしょうか?
torakiyojp
常連さん
会議室デビュー日: 2004/08/04
投稿数: 23
投稿日時: 2005-06-27 12:58
Singletonってサブクラス化できたんですね。
Googleに教えてもらいました。

失礼しました。
asip
ベテラン
会議室デビュー日: 2001/12/27
投稿数: 77
投稿日時: 2005-06-30 12:22
クラス設計に関するメモ->Singletonパターンを使うときの注意
http://homepage3.nifty.com/satoshis/oo/memo.html#singleton

上記で扱っているのはGOF本のSingletonパターンのデメリットです。世界中、
どこにいっても通用する「Singletonパターン」は"GOF本のSingletonパターン"です。

Singletonのサブクラス化(結城浩氏著->Java言語で学ぶデザインパターン入門)
http://www.hyuki.com/techinfo/singleton.html

上記で解説しているのはSingletonパターンの問題点である継承不能を回避するために
改良したパターンで「Singletonパターン」の"改良版"です。
これを「Singletonパターン」といっても大概の場合、話は噛み合いません。GOF本の
「Singletonパターン」が"一般に認知されている「Singletonパターン」"ですから。

ユーティリティクラスのstaticメソッドでの作成がユーティリティクラスのsingleton
パターンによる作成よりも優れている点はユーティリティクラスのインスタンスが
生成されない、生成する必要がない点です。
 ユーティリティクラスをsingletonパターンで作成した場合、常にgetInstanceメソッド
でインスタンスを取得してからそのメソッドを呼び出す必要があり、コードが
冗長になる可能性があります。[また、インスタンス取得用の変数を定義して、
getInstanceメソッドの記述を忘れて、インスタンス取得用の変数.メソッドと記述しても
コンパイルは通り、実行時にエラーがでるまで記述ミスに気づかないかもしれないので
バグの温床になりかねません。(取消し線が使えないので代わりに斜体にしておきます)]
  また、ユーティリティクラスをstaticメソッドで作成した場合、staticメソッドを
呼び出すだけなのでSingletonパターンで作成する場合よりも短いコーディング量で
すみます。

[ メッセージ編集済み 編集者: asip 編集日時 2005-06-30 15:51 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-06-30 12:52
引用:

asipさんの書き込み (2005-06-30 12:22) より:
また、インスタンス取得用の変数を定義して、
getInstanceメソッドの記述を忘れて、インスタンス取得用の変数.メソッドと記述しても
コンパイルは通り、実行時にエラーがでるまで記述ミスに気づかないかもしれないので
バグの温床になりかねません。


これって、

コード:
Singleton instance;
instance.method();


こんなコードですか? 本当にコンパイル通りますか? こんなのが「バグの温床」になり得ますか?
変数がインスタンス変数であれば通るでしょうが、シングルトンオブジェクトをインスタンス
変数で保持する意味はないですよね。
asip
ベテラン
会議室デビュー日: 2001/12/27
投稿数: 77
投稿日時: 2005-06-30 15:32
コード:
Class AAA {

 SingletonUtility bbb = null;
 SingletonUtility2 ccc = null;
 public AAA{
  bbb = SingletonUtility.getInstance();--※
  ccc = SingletonUtility2.getInstance();--※
 }
 public void testA{
  ... = bbb.メソッドA(...);
  ... = ccc.メソッドE(...);
  ... = bbb.メソッドB(...);
 }
 public void testB{
  ... = bbb.メソッドC(...);
  ... = bbb.メソッドD(...);
  ... = ccc.メソッドF(...);
 }
}

このようなコードを想定していました。
上記のコードで※行を省略した場合、実行時にNullPointerExceptionになります。
ユーティリティ系のクラスは一つのメソッドの中で何度も呼ぶケースが
多いので、Singelton系ユーティリティのgetInstance()はコンストラクタ
で呼んでインスタンス変数に参照を格納し、各メソッド中ではそのインスタンス
変数でメソッドを呼び出しています。
 各メソッドで変数定義し、getInstance()するよりは見た目がすっきりし、
コード量も減ると思います、特にSingleton系ユーティリティが一つのクラスで
幾つも呼ばれる場合には。
 ほとんどの場合、Singletonパターンでのユーティリティクラスの作成・その
使用ではなくStaticメソッドでのユーティリティクラスの作成・その使用を行うので、
上記のようなコードをユーティリティクラスの呼び出しで書くことはまずありませんが。
 言われてみると上記のようなコードを書く人は少ないと思うので、修正は
しておきます。
コード:
Singleton instance = null;

instance.method();

ちなみにこのように書けばコンパイルエラーにはなりません♪

[ メッセージ編集済み 編集者: asip 編集日時 2005-06-30 16:31 ]

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