flyweightパターンを久々に見た
とあるコードを読んでいたら、flyweightパターンを使っている箇所を発見。
import java.util.HashMap; import java.util.Map; /** * IDファクトリ */ public interface IDFactory { /** * 文字列からIDを生成します。 * @param src 文字列 * @return ID */ ID createId(String src); /**唯一のインスタンス*/ IDFactory instance = new IDFactory() { /**ID*/ private final Map<String,ID> ids = new HashMap<String,ID>(); @Override public ID createId(String src) { synchronized(this) { if (ids.containsKey(src)) return ids.get(src); ID id = new IDImpl(src); ids.put(src, id); return id; } } }; }
いやー、最近めっきりみかけなくなったな、と思って何でだろうかと考えてみた。
- IDが運用中に次々発行されるようなサーバープログラムの場合、メモリリークの原因となる
- ↑のコードもそうだけど、SoftReferenceとかLRUで古いものを破棄する、とかいう仕組みがないとまずいよね。
- メモリがたくさん使えるようになった
- 最近は安いですからね。
- カツカツな環境で動作させるプログラムだと、がしがし使われているのかもなー。
- インスタンスの生成が早くなった
- 昔は大変遅かったという話を聞いたことがあるような、ないような。
とりあえず思いつくのはこの辺かな。しかし、「XP+デザインパターン全盛期」世代としては懐かしい限り。DecoratorとかもAspectになっちゃったよな。