事務屋さんの備忘録

主にプログラミングのことを書いていきます。メモというか備忘録的な感じで。プログラミングといっても、私はプロのエンジニアでも本職のプログラマーでもありません。単なる事務職をやってるサラリーマンで、空いた時間にちょこちょこっとプログラミングしてる程度です。よってこのブログに記載したことが誤っていたり、もっとよい方法がある場合もあると思います。その場合には、ご指摘いただけると嬉しいです。また、このブログを読んで役に立った、なんて方がいらっしゃったら幸いですね。

デザインパターン Flyweightパターン

メモ。使う機会あるかな?

package com.flyweight01;

public class HumanLetter {
	
	private String letter;
	
	public HumanLetter(String letter){
		this.letter = letter;
	}
	
	public void display(){
		System.out.println(letter);
	}

}
package com.flyweight01;

import java.util.HashMap;
import java.util.Map;

public class HumanLetterFactory {
	
	private Map<String,HumanLetter> map = new HashMap<String,HumanLetter>();
	
	// singletonパターン
	public static HumanLetterFactory singleton = new HumanLetterFactory();
	private HumanLetterFactory(){	
	}
	public static HumanLetterFactory getInstance(){
		return singleton;	
	}
	
	public int countInstance(){
		return map.size();	
	}
	
	public synchronized HumanLetter getHumanLetter(String letter){
		HumanLetter humanLetter = map.get(letter);
		if (humanLetter == null) {
			humanLetter = new HumanLetter(letter);
			map.put(letter, humanLetter);
		}
		return humanLetter;	
	}
	
}
package com.flyweight01;

public class Main {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		HumanLetterFactory factory = HumanLetterFactory.getInstance();
		
		// インスタンスが生成される
		factory.getHumanLetter("a").display();
		factory.getHumanLetter("b").display();
		factory.getHumanLetter("c").display();
		
		// インスタンスは生成されない
		factory.getHumanLetter("a").display();
		factory.getHumanLetter("b").display();
		factory.getHumanLetter("c").display();
		
		// インスタンスの個数 3
		System.out.println(factory.countInstance());
	}

}