어떤 클래스의 인스턴스 한 개만 가지고 여러 개의 "가상 인스턴스"를 제공하고 싶을 때 사용하는 패턴
인스턴스를 가능한 대로 공유시켜 new연산자를 통한 메모리 낭비를 줄이는 방식
Shape.class
public interface Shape {
public void draw();
}
Circle .class
public class Circle implements Shape {
private String color;
private int x;
private int y;
private int radius;
public Circle(String color) {
this.color = color;
}
public void setColor(String color) {
this.color = color;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
public void setRadius(int radius) {
this.radius = radius;
}
@Override
public void draw() {
System.out.println("Circle [color=" + color + ", x=" + x + ", y=" + y + ", radius=" + radius + "]");
}
}
ConcreteFlyweight
: 인터페이스(API)의 내용을 정의하고, 필요한 속성을 가질 수 있다.ShapeFactory .class
public class ShapeFactory {
private static final HashMap<String, Circle> circleMap = new HashMap<>();
public static Shape getCircle(String color) {
Circle circle = (Circle)circleMap.get(color);
if(circle == null) {
circle = new Circle(color);
circleMap.put(color,circle);
System.out.println("==== 새로운 객체 생성 : " + color + "색 원 ====" );
}
return circle;
}
}
getCircle()
: 객체의 생성 또는 공유의 역할을 담당하며 클라이언트에게 응답한다.Main.class
public static void main(String[] args) {
String[] colors = {"Red","Green","Blue","Yellow"};
for (int i = 0; i < 10; i++) {
Circle circle = (Circle)ShapeFactory.getCircle(colors[(int) (Math.random()*4)]);
}
}
Warehouse
에게 요청한다참조: