구조패턴 : 클래스나 객체를 상속과 합성을 통하여 더 큰 구조를 만드는 패턴
플라이웨이트(flgweight)
우선 flgweight는 가벼운 무게를 의미한다. 그러면 가벼운 무게를 지닌 패턴??
좀 더 풀어서 말하면 아래 두 문장으로 말할 수 있다.
1. 객체 내부에서 참조하는 객체를 지속적으로 만드는 게 아니라 없을 경우 만들고, 있을 경우 객체를 공유하는 패턴이다.
2. 공통으로 사용하는 클래스를 만드는 팩토리 클래스를 두고, 사용하는 클래스의 인스턴스가 팩토리 클래스 내에 있으면 해당 인스턴스를 공유하고, 없으면 새로 만드는 패턴이다.
인스턴스를 필요할 때마다 생성하는 게 아닌 있으면 해당 인스턴스를 공유하는 구조이기에 쓸데없는 new연산을 하지 않아 메모리 공간을 절약을 할 수가 있다. 메모리 공간을 절약=가벼운 무게
플라이웨이트 구조
- FlyweightFactory
사용할 인스턴스를 생성하거나 또는 공유해주는 팩토리 클래스
- Flyweight
사용할 객체의 인터페이스
- ConcreteFlyWeight
Flyweight 내용을 정의한다 .실제 공유될 객체
즐겨했던 배그를 생각해본다.
게임 내 M4, 베릴, 더블배럭,권총 등 되게 많은 무기들이 있으며, 각 무기 별로 동일한 공격력,무게를 지니고 있다.
해당 무기들은 공격력,무게 등은 바뀌지 않는다. 무기들은 게임 상 여러 개씩 존재한다.
게임 상 동일한 무기들도 여러 자루씩 존재한다.
개발 요건
1. 여러 종류의 무기들 존재 ( M4, 베릴 , 이글 )
2. 무기 별로 동일한 공격력,무게 가진다 / 공격력 무게 등은 변하지 않는다.
3. 게임 내 동일한 무기들이 여러 자루씩 존재한다.
반복되는 무기들을 모두 생성할 경우?
메모리가 펑~~~~ 터져버린다.
어떻게 해야할까?
게임 상 동일한 무기들은 객체 생성이 아닌 공유를 하도록 한다.(플라이웨이트 패턴 적용)
public class Weapon {
private String weaponName;
private int power;
private int weight;
Weapon(String weaponName, int power, int weight) {
this.weaponName = weaponName;
this.power = power;
this.weight = weight;
}
public String getWeaponName() {
return weaponName;
}
public int getPower() {
return power;
}
public int getWeight() {
return weight;
}
public void attack(){
System.out.println(this.weaponName +"로 공격!!");
}
}
public class M4 extends Weapon{
public M4() {
super("M4", 10, 10);
}
}
public class Beryl extends Weapon{
Beryl() {
super("베릴", 20, 10);
}
}
public class Eagle extends Weapon{
Eagle() {
super("이글", 5, 5);
}
}
상위 클래스 Weapon을 두고 실제 총을 나타내는 M4 , Berly , Eagle 클래스가 Weapon을 상속받도록 한다.
//팩토리 클래스는 하나만 존재하면 되므로 싱글톤 패턴 적용
public class WeaponFactory {
//생성자로 생성불가
private WeaponFactory(){}
public enum WeaponList {Beryl , M4, Eagle}
public static final HashMap<WeaponList,Weapon> weaponShareMap = new HashMap<>();
private static class SingletonHolder{
private static final WeaponFactory INSTANCE = new WeaponFactory();
}
public static WeaponFactory getInstance(){
return SingletonHolder.INSTANCE;
}
//플라이웨이트 패턴 적용
public Weapon getWeapon(WeaponList weapon){
if(weaponShareMap.containsKey(weapon)) {
System.out.println("공유객체 사용");
return weaponShareMap.get(weapon);
}
switch (weapon){
case M4 : weaponShareMap.put(WeaponList.M4,new M4()); break;
case Beryl : weaponShareMap.put(WeaponList.Beryl,new Beryl()); break;
case Eagle : weaponShareMap.put(WeaponList.Eagle,new Eagle()); break;
default : return null;
}
System.out.println("신규객체 생성");
return weaponShareMap.get(weapon);
}
}
팩토리 클래스는 여러개일 필요가 없으므로 싱글톤 패턴을 적용하였다.
public class Main {
public static void main(String[] args) {
WeaponFactory weaponFactory= WeaponFactory.getInstance();
Weapon w1= weaponFactory.getWeapon(WeaponFactory.WeaponList.M4);
Weapon w2 = weaponFactory.getWeapon(WeaponFactory.WeaponList.M4);
w2.attack();
}
}
신규객체 생성
공유객체 사용
M4로 공격!!
w1은 인스턴스 생성하였으나 w2는 w1과 동일한 인스턴스를 공유하고 있다!!
참고
디자인 패턴(Design Pattern) : 퍼사드 / 플라이웨이트 (robotstory.co.kr)
'디자인패턴 > 구조' 카테고리의 다른 글
[디자인패턴] 브릿지 패턴 (0) | 2023.04.28 |
---|---|
[디자인패턴] 어댑터 패턴 (0) | 2023.03.23 |
[디자인패턴]컴포지트(composite) 패턴 (0) | 2023.03.22 |
[디자인패턴]데코레이트 패턴 (0) | 2023.03.15 |