読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

flyweightパターンを久々に見た

Java

とあるコードを読んでいたら、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になっちゃったよな。