liguofeng29’s blog

個人勉強用ブログだっす。

デザインパターン - FlyWeight

flyweightパターンとは】

インスタンスを共有して、メモリを節約する。

 

flyweightパターンのクラス図】

 

flyweightパターンのメリット】

オブジェクトが状態を持つごとで、オブジェクトの利用者は状態による違う振る舞いを気にする必要なくなる。

 

【サンプル】

CharFactory.java
package flyweight;
 
import java.util.HashMap;
import java.util.Map;
 
// 文字生成工場
public class CharFactory {
 
private Map<String, Character> charMap = new HashMap<String, Character>();
 
private static CharFactory singleton = new CharFactory();
 
private CharFactory() {
System.out.println("CharFactoryが生成されました");
}
 
public static CharFactory getInstance() {
return singleton;
}
 
// マルチスサーフ
public synchronized Character getChar(String s) {
Character c = charMap.get(s);
if (c == null) {
System.out.println(s + "がなかったので、生成し保存しました。");
charMap.put(s, new Character(s.charAt(0)));
c = charMap.get(s);
}
 
return c;
}
}
 
 
 
 
 

FlyWeightTest.java
package flyweight;
 
public class FlyWeightTest {
 
/**
* @param args
*/
public static void main(String[] args) {
CharFactory factory = CharFactory.getInstance();
 
// 「a」表示
System.out.println(factory.getChar("a"));
 
// 「a」を50回表示
for (int i = 0; i < 50; i++) {
// 上で生成されているので、生成せず使うだけ
System.out.print(factory.getChar("a"));
}
System.out.println();
 
// 「b」表示
System.out.println(factory.getChar("b"));
}
 
}
 
 
 

実行結果
CharFactoryが生成されました
aがなかったので、生成し保存しました。
a
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bがなかったので、生成し保存しました。
b
 
 
 
※このパターンを適用するオブジェクトは、生成後変更されないものが望ましいのだ。。