플라이웨이트(Flyweight) 패턴의 쉬운 예제

Choizz·2023년 2월 15일
0

디자인 패턴

목록 보기
6/8

플라이웨이트 패턴

오늘은 디자인 패턴 중 플라이웨이트(flyweight) 패턴에 대해 포스팅해 보려고 한다.

플라이웨이트의 패턴의 특징과 용도는 다음과 같다.

특징

  • 객체를 생성한 후 저장하고 재사용한다.
  • 만약 존재하는 객체이면 그 객체를 사용하고 없는 객체이면 새로 만든다.
  • 플라이웨이트 객체는 불변 객체이다.

용도

  • 메모리 할당을 줄이기 위해 사용한다.
  • 객체를 생성하는데 필요한 자원을 줄여 애플리케이션 성능 향상시킨다.
  • 데이터 압축과 데이터 캐싱에 사용된다.

코드

  • Vehicle 인터페이스를 만든다.
public interface Vehicle {
     void start();
     void stop();
     Color getColor(); 
}
  • Vehicle 인터페이스를 구현하는 Car 클래스를 만든다.
public class Car implements Vehicle {
    
    //toString 생략
    
    private Engine engine;
    private Color color;

    public Car(Engine newEngine, Color newColor) {
        this.engine = newEngine;
        this.color = newColor;
    }

    @Override
    public void start() {
        System.out.println("start");
    }

    @Override
    public void stop() {
        System.out.println("stop");
    }

    @Override
    public Color getColor() {
        return this.color;
    }
}
  • Color 클래스를 만든다.

//toString 생략

public class Color {
    private String name;

    public Color(String name) {
        this.name = name;
    }
}
  • Vehicle 객체를 생성하는 Factory 클래스를 만든다.
    • (1) 이 클래스 안에는 차량의 색상(Color)을 key로 하고, Vehicle을 value로 하는 Map을 저장소로 사용한다.
    • (2) Vehicle을 객체를 생성하는 createVehicle 메서드를 정적 메서드로 만든다.
      - (2)-1 : computeIfAbsent를 이용해서 만약 map에 있는 데이터면 그 데이터를 리턴하고, 없다면, map에 저장하고 car를 리턴한다.
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;

public class VehicleFactory {
    
    //(1)
    private static final Map<Color, Vehicle> vehicleMap = new HashMap<>();

    //(2)
    public static Vehicle createVehicle(Color color) {
    
    	//(2)-1
        Vehicle newVehicle = vehicleMap.computeIfAbsent(color, newColor -> {
            Engine newEngine = new Engine();
            return new Car(newEngine, newColor);
        });
        System.out.println("vehicleMap: " + vehicleMap);
        return newVehicle;
    }
}

클라이언트 코드에서는 차량의 색상만 영향을 줄 수 있고, 차량 객체 자체의 상태는 변경할 수 없다.

public class Main {

    public static void main(String[] args) {
        Color redColor = new Color("red"); // 색상을 빨강색으로 설정

        Car vehicle = (Car) VehicleFactory.createVehicle(redColor); // 객체 생성
        System.out.println(vehicle);

        Car vehicle1 = (Car) VehicleFactory.createVehicle(redColor); // 위의 vehicle 객체와 같은 객체가 생성되는지 확인,
        System.out.println(vehicle1);

        Color buleColor = new Color("blue"); //색상을 파란색으로 설정
        
        Car vehicle2 = (Car) VehicleFactory.createVehicle(buleColor);
        System.out.println(vehicle2);

        Car vehicle3 = (Car) VehicleFactory.createVehicle(buleColor); //위의 vehicle2 객체와 같은 객체가 생성되는지 확인,
        System.out.println(vehicle3);

    }
}
  • 결과
// color가 같으면 이전에 생성된 객체가 반환됨
vehicleMap: {Color{name='red'}=Car{engine=Engine@2c9f9fb0, color=Color{name='red'}}}
Car{engine=Engine@2c9f9fb0, color=Color{name='red'}}

vehicleMap: {Color{name='red'}=Car{engine=Engine@2c9f9fb0, color=Color{name='red'}}}
Car{engine=Engine@2c9f9fb0, color=Color{name='red'}}

//새로운 color가 생기면 다른 객체가 생성됨.
vehicleMap: {Color{name='blue'}=Car{engine=Engine@9f70c54, color=Color{name='blue'}}, Color{name='red'}=Car{engine=Engine@2c9f9fb0, color=Color{name='red'}}}
Car{engine=Engine@9f70c54, color=Color{name='blue'}}

vehicleMap: {Color{name='blue'}=Car{engine=Engine@9f70c54, color=Color{name='blue'}}, Color{name='red'}=Car{engine=Engine@2c9f9fb0, color=Color{name='red'}}}
Car{engine=Engine@9f70c54, color=Color{name='blue'}}

정리

  • 플라이웨이트 패턴을 사용했을 때 결과를 보면,
    • 같은 색상으로 객체를 생성했을 때 동일한 객체를 생성하고,
    • 색상이 다르면 다른 객체가 생성되는 것을 확인할 수 있다.

Refernce

profile
집중

0개의 댓글