diff --git a/src/main/java/coordinate/FigureFactory.java b/src/main/java/coordinate/FigureFactory.java index 8657ada..33e42b0 100644 --- a/src/main/java/coordinate/FigureFactory.java +++ b/src/main/java/coordinate/FigureFactory.java @@ -1,9 +1,33 @@ package coordinate; +import java.util.HashMap; import java.util.List; +import java.util.function.Function; + +public class FigureFactory implements FigureCreator{ + static final HashMap, Figure>> figures = new HashMap<>(); + + static { + figures.put(Line.LINE_POINT_SIZE, (Line::new)); + figures.put(Triangle.TRIANGLE_POINT_SIZE, Triangle::new); + figures.put(Rectangle.RECTANGLE_POINT_SIZE, Rectangle::new); + } + + @Override + public Figure create(List points) { + Function, Figure> figure = figures.get(points.size()); + + if (figure == null) { + throw new IllegalArgumentException("유효하지 않은 도형입니다."); + } + + return figure.apply(points); + + } -public class FigureFactory { static Figure getInstance(List points) { + + if (points.size() == Line.LINE_POINT_SIZE) { return new Line(points); } diff --git a/src/test/java/coordinate/FigureFactoryTest.java b/src/test/java/coordinate/FigureFactoryTest.java index 91d1a8f..581b247 100644 --- a/src/test/java/coordinate/FigureFactoryTest.java +++ b/src/test/java/coordinate/FigureFactoryTest.java @@ -6,8 +6,10 @@ import java.util.List; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class FigureFactoryTest { + @Test public void line() { List points = Arrays.asList( @@ -43,4 +45,56 @@ public void rectangle() { assertThat(figure).isInstanceOfAny(Rectangle.class); assertThat(figure.getName()).isEqualTo("사각형"); } + + @Test + public void lineCreate() { + List points = Arrays.asList( + Point.of(1, 2), + Point.of(2, 3)); + + Figure figure = new FigureFactory().create(points); + assertThat(figure).isInstanceOfAny(Line.class); + assertThat(figure.getName()).isEqualTo("선"); + } + + @Test + public void triangleCreate() { + List points = Arrays.asList( + Point.of(1, 1), + Point.of(4, 1), + Point.of(1, 4)); + + Figure figure = new FigureFactory().create(points); + assertThat(figure).isInstanceOfAny(Triangle.class); + assertThat(figure.getName()).isEqualTo("삼각형"); + } + + @Test + public void rectangleCreate() { + List points = Arrays.asList( + Point.of(1, 1), + Point.of(4, 1), + Point.of(1, 4), + Point.of(4, 4)); + + Figure figure = new FigureFactory().create(points); + assertThat(figure).isInstanceOfAny(Rectangle.class); + assertThat(figure.getName()).isEqualTo("사각형"); + } + + @Test + public void unkown() { + List points = Arrays.asList( + Point.of(1, 1), + Point.of(4, 1), + Point.of(1, 4), + Point.of(4, 4), + Point.of(5, 5)); + + assertThatThrownBy(() -> { + new FigureFactory().create(points); + }) + .hasMessage("유효하지 않은 도형입니다.") + .isInstanceOf(IllegalArgumentException.class); + } }