플라이웨이트(Flyweight) 패턴: 구조패턴
동일하거나 유사한 객체들 사이에 가능한 많은 데이터를 서로 공유하여 사용하도록 하여 메모리 사용량을 최소화하는 디자인 패턴이다.
특정 클래스의 인스턴스 한 개만 가지고 여러 개의 가상 인스턴스를 제공하고 싶을 때 사용한다. 쉽게 말해 인스턴스를 가능한 대로 공유하여 메모리 낭비를 줄이는 방법이다. 중요한 점은 중복되는 객체는 공유해서 사용하자는 것!
- Flyweight
- 공유에 사용할 클래스들의 인터페이스를 선언
- ConcreteFlyweight
- Flyweight의 구체 클래스 (실제 공유될 객체)
- FliweightFactory
- Flyweight 인스턴스를 생성 또는 공유해주는 역할
- Client
- 플라이웨이트틀 사용하는 사용자
Weapon(Flyweight)
package structural.flyweight;
public interface Weapon {
void getName();
}
LongSword(ConcreteFlyweight)
package structural.flyweight;
public class LongSword implements Weapon{
@Override
public void getName() {
System.out.println("롱소드");
}
}
ShortSword(ConcreteFlyweight)
package structural.flyweight;
public class ShortSword implements Weapon{
@Override
public void getName() {
System.out.println("숏소드");
}
}
Wand(ConcreteFlyweight)
package structural.flyweight;
public class Wand implements Weapon{
@Override
public void getName() {
System.out.println("지팡이");
}
}
WeaponFactory(FliweightFactory)
package structural.flyweight;
import java.util.HashMap;
import java.util.Map;
public class WeaponFactory {
private Map<String, Weapon> weaponMap;
public WeaponFactory(){
weaponMap = new HashMap<>();
weaponMap.put("롱소드", new LongSword());
weaponMap.put("숏소드", new ShortSword());
weaponMap.put("지팡이", new Wand());
}
public Weapon getInstance(String name){
return weaponMap.get(name);
}
}
Client
package structural.flyweight;
public class FlyweightClient {
public static void main(String[] args) {
WeaponFactory factory = new WeaponFactory();
Weapon longSword = factory.getInstance("롱소드");
Weapon shortSword = factory.getInstance("숏소드");
Weapon wand = factory.getInstance("지팡이");
longSword.getName();
shortSword.getName();
wand.getName();
}
}
'OOP > Design Pattern' 카테고리의 다른 글
13. 커맨드(Command) 패턴 (0) | 2023.02.20 |
---|---|
12. 프록시(Proxy) 패턴 (0) | 2023.02.20 |
10. 퍼사드(Facade) 패턴 (0) | 2023.02.20 |
09. 데코레이터(Decorator) 패턴 (0) | 2023.02.14 |
08. 컴포지트(Composite) 패턴 (0) | 2023.02.14 |