장점 : 애플리케이션에서 사용하는 메모리를 줄일수 있다
단점 : 코드의 복잡도가 증가한다
클라이언트는 Flyweight를 사용하기위해서 FlyweightFactory를 이용해서 실제 객체를 사용하게 된다.
출처 : https://ducmanhphan.github.io/2020-02-28-Flyweight-pattern/
예시
Flyweight : Flyweight의 공통된 메서드를 정의하고 Factory에 제공하는 클래스(인터페이스)
ConcreteFlyweight : 구체적인 Flyweight의 기능을 구현하고 실제로 사용될 객체
FlyweightFactory : 해당 클래스를 사용해서 Flyweight의 인스턴스를 생성 또는 공유(캐싱)해주는 역할을 한다.
Client : Factory를 이용해 Flyweight객체를 제공받는 자
/**
* Flyweight InterFace
* */
public interface Element {// 글자속성에 필요한 공통 메서드
void getInformation();
}
/**
* flyWeight Concrete 클래스
* 불변객체여야함
*/
@Getter
@ToString
public final class Font implements Element{
// 모든 필드를 final로 생성해야댐
final String family;
final int size;
public Font(String family, int size) {
this.family = family;
this.size = size;
}
@Override
public void getInformation() {
System.out.println("FontFamily : "+ family + ", size : "+ size);
}
}
/**
* flyWeight Factory 객체
*/
public class FontFactory {
private Map<String, Element> cache = new HashMap<>();
/**
* cache.containsKey(font) 캐쉬된 객차가 있으면 그객체를 리턴하고
* 아니면 새로운 객체를 생성한후 리턴
*
* @param font
* @return
*/
public Element getFont(String font) {
if (cache.containsKey(font)) {
return cache.get(font);
} else {
String[] split = font.split(":");
Element newFont = new Font(split[0], Integer.parseInt(split[1]));
cache.put(font, newFont);
return newFont;
}
}
}
public class Client {
public static void main(String[] args) {
FontFactory fontFactory = new FontFactory();
//Character 속성중 자주 변하는 속성인 Color , Name 속성 외에
//FontSize 및 FontFamily는 FlyWeight 패턴을 이용해 메모리 사용을 줄임
Character c1 = new Character('a', "red", fontFactory.getFont("nanm:12"));
Character c2 = new Character('b', "yellow", fontFactory.getFont("nanm:13"));
Character c3 = new Character('c', "blue", fontFactory.getFont("nanm:12"));
System.out.println("c1 = " + c1.toString());
System.out.println("c2 = " + c2.toString());
System.out.println("c3 = " + c3.toString());
fontFactory.getFont("nanm:12").getInformation();
}
}
Integer i1 = Integer.valueOf(10000);
Integer i2 = Integer.valueOf(10000);
System.out.println(i1.equals(i2));
//결과값 True
@HotSpotIntrinsicCandidate
public static Integer valueOf(int i) {
return i >= -128 && i <= Integer.IntegerCache.high ? Integer.IntegerCache.cache[i + 128] : new Integer(i);
}
출처 : 백기선님의 디자인패턴