Abstract Factory?
- 추상 팩토리 : 서로 관련이 있는 객체를 묶은 다음 팩토리 클래스(Object)를 만들어서, 조건에 따라 객체를 생성하게 하는 디자인 패턴
* 주로 비슷한 특성을 가지는 객체를 생성할 때, 어떤 객체를 생성할 것인지 판별하는 로직을 Factory Class에게 책임을 위임하여 수행하게 된다!
예를 들어, Rectangle(직사각형) Circle(원) 이라는 객체들은.. Shape(도형) 이라는 공통적인 부분이 존재한다!
이런 비슷한 객체들을 Shape Factory가 객체를 생성하게 위임하는 것이다!!!
실제 코드
다음과 같은 인터페이스가 있다고 해보자.
package designpattern.abstractfactory;
interface Shape {
String getType();
}
1. Shape 인터페이스
그리고, Shape를 상속받아서 Rectangle과 Circle을 만들었다!
package designpattern.abstractfactory;
public class Rectangle implements Shape {
@Override
public String getType() {
return "Rectangle";
}
}
package designpattern.abstractfactory;
public class Circle implements Shape {
@Override
public String getType() {
return "Circle";
}
}
2. Circle, Rectangle 클래스
우리는 이러한 객체들을 직접적으로
Circle circle = new Circle();
Recatngle rectangle = new Rectangle();
이렇게 객체를 생성하지 않고, Abstract Factory를 만들 것이다!!
package designpattern.abstractfactory;
public class ShapeFactory {
enum ShapeType {
CIRCLE("Circle") {
@Override
Shape create() {
return new Circle();
}
},
RECTANGLE("Rectangle") {
@Override
Shape create() {
return new Rectangle();
}
};
private final String type;
ShapeType(String type) {
this.type = type;
}
abstract Shape create();
}
public static Shape create(final String message) {
return ShapeType.valueOf(message)
.create();
}
}
3. Enum을 활용한 ShapeFactory
create라는 메서드를 통해서 어떤 객체를 생성할 것인지 message를 통해 결정하게 된다!!
Enum을 적극적으로 활용하게 되면, 코드의 확장성이 엄청 쉬워지고, 다른 사람이 읽기가 편해진다! (가독성 Up)
Java에서 Enum에 대한 활용은 여러 블로그들에도 많이 게시되어 있으니, 직접 찾아보시길 권장합니다~!
위 코드를 바탕으로
테스트 코드도 같이 올리면..!!
package designpattern.abstractfactory;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
class ShapeFactoryTest {
@Test
void 도형을_제대로_생산하는지_확인() {
/* Then */
assertThat(ShapeFactory.create("CIRCLE").getType()).isEqualTo("Circle");
assertThat(ShapeFactory.create("RECTANGLE").getType()).isEqualTo("Rectangle");
}
}
4. ShapeFactoryTest
사용자가 원하는 객체를 제대로 생성했는지, 확인하는 테스트 코드다!
당연하겠지만, 무난히 통과된다.
최종적인 Class Diagram은 다음과 같다.
Factory Method 패턴과의 차이?
Abstract Factory, Factory Method 둘 다 객체를 생성한다는 의미에서 비슷해보일 수도 있다!
하지만 두 디자인 패턴은 엄연히 다른 패턴이다.
Factory Method 패턴은 기존의 Factory Class에서 특정 메소드가 객체를 생산하는 역할을 담당하게 된다!
= 하나의 Method에서 여러 개의 객체를 생성한다!
Abstract Factory는 말 그대로 Object에 의해서 어떤 객체를 생성할 것인지 결정하게 된다!
= 하나의 Object가 하나의 객체를 생산한다!
* 자세한건 역시 StackOverFlow를 참조하시길 바랍니다.
참고
팩토리 메서드와 추상 팩토리 패턴의 차이
추상 팩토리 패턴
'Developer > Design Pattern' 카테고리의 다른 글
Adapter Pattern - 어댑터 패턴 (0) | 2019.06.23 |
---|---|
Factory Method Pattern - 팩토리 메서드 (0) | 2019.06.21 |
Template Method Pattern - 템플릿 메소드 패턴 (0) | 2019.06.09 |
Observer Pattern - 옵저버 패턴 (0) | 2019.06.09 |
Visitor Pattern - 비지터 패턴, 방문자 패턴 (2) | 2019.05.26 |