오늘은 디자인 패턴 중 플라이웨이트(flyweight) 패턴에 대해 포스팅해 보려고 한다.
플라이웨이트의 패턴의 특징과 용도는 다음과 같다.
public interface Vehicle {
void start();
void stop();
Color getColor();
}
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;
}
}
//toString 생략
public class Color {
private String name;
public Color(String name) {
this.name = name;
}
}
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