
「Flyweight(フライウェイト)」ってどんなパターン?
小さくて軽いオブジェクトをたくさん作りたい場合に有効なパターンです。
メリット
オブジェクトの生成や、保持に必要なトータルの負荷(メモリ)を下げることができます。
実際には、Javaには、「ガーベジコレクション」というメモリを自動で解放する仕組みがあるので、それほどメモリにおいては、問題になることはありません。
ただ、よりメモリ管理の上でも、品質の高いプログラムを作るうえでは、知っておいた方がよいでしょう。
実際に実装してみる。
実装イメージとしては、下記のクラス図のようになります。
Main.java(実行するプラグラム)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
package flyweight; public class Main { public static void main(String[] args) { FullCousePool pool = new FullCousePool(); FullCouse ordbul = pool.getCouse("前菜", "サラダ"); System.out.println(ordbul); System.out.println(ordbul.kousei +":"+ordbul.name); FullCouse soup = pool.getCouse("前菜", "スープ"); System.out.println(soup); System.out.println(soup.kousei +":"+soup.name); FullCouse main1 = pool.getCouse("メインディッシュ", "肉料理"); System.out.println(main1); System.out.println(main1.kousei +":"+main1.name); FullCouse main2 = pool.getCouse("メインディッシュ", "魚料理"); System.out.println(main2); System.out.println(main2.kousei +":"+main2.name); } } |
FullCousePool.java(オブジェクトをプールしておくクラス)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package flyweight; import java.util.HashMap; /** * フルコースの料理をプールするクラスです。 */ public class FullCousePool { HashMap<String,FullCouse> dinnerPool = new HashMap<>(); FullCouse getCouse(String kousei,String name) { FullCouse shareObj = (FullCouse)dinnerPool.get(kousei); if(shareObj==null) { shareObj = new FullCouse(kousei); dinnerPool.put(kousei, shareObj); } shareObj.name = name; return shareObj; } } |
FullCouse.java(プールされるオブジェクト)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package flyweight; /** * フルコースクラスです。 */ public class FullCouse { String name; String kousei; FullCouse(String kousei){ this.kousei = kousei; } } |
実行結果
作りたい種類のインスタンスごとに、同じインスタンスが使いまわされる実装になっていることがわかりますね。
この記事へのコメントはありません。