Singletonか、ダイコンか。
ダイコンで管理されるコンポーネントは、生成されるインスタンスを1つだけに制限できる(Seasarだとデフォルトでそうなりますな)。これがSingletonパターンとどう違うのか考えてみた。
まずSingletonパターンの特徴。
- 継承できない(さわださんのSingleton Wrapper使うって手もあるけど)
- Singletonの実装クラスに他のクラスが依存してしまう(staticメソッドを使うから、実装クラスがハードコーディングされてしまう)
- 特殊なコーディングが必要(コンストラクタをprivateにしなきゃならん、とか)
- 1つの
VMクラスローダー上で絶対に1つのインスタンスしか存在しないことを保証出来る
というのを挙げられるかもしれない。
ではダイコンでコンポーネントを管理させる場合は……
- 継承可能(POJOで良いから)
- コンポーネントを利用するクラスは実装クラスに依存しない
- アスペクトを適用できる
- ダイコンを経由しないでインスタンスを作っちゃえるので、2つ以上のインスタンスが存在することもありえる(コーディング規約で禁止すればいいんだけど)
うーん、圧倒的にダイコンですかね……。ダイコン時代にはSingletonパターンはアンチパターンとなるかも。
【追記】もう一つ重要なのを忘れてた。他のコンテナは知りませんがSeasarだとコンポーネントの廃棄時に終了化メソッドを呼び出せる。こんなんSingletonでは無理。
農家か、ヨメか。
なぜか「農家のヨメになりたい」という検索キーワードでここに来る人が何人かいるな…。せっかくなので、「僕の母親の実家は農家ですよ!山も田畑も持ってますよ!!」とアピールしておこう(ぇ)。
【追記】コメント欄で書いた通り、「Green」ドラマ化効果だった模様。「農家にゆかりの深い俺様の時代が来たぜ!」とか考えてましたよ……orz。