취업과 기본기 튼튼/빽 투더 기본기
[디자인 패턴 3편] 생성 패턴, 팩토리 메쏘드 (Factory)
흠시
2019. 11. 21. 16:43
1. 개념
팩토리 패턴은 인터페이스로 객체들을 정의하고,
팩토리가 인스턴스를 생성하는 패턴이다.
1.1. 장점
- 객체 생성 하는 코드를 분리하여 클라이언트 코드와 결합도(의존성)를 낮춤.
- 코드에 변경이 필요할 시, 객체 생성 클래스만 수정하면 된다.
- 인터페이스를 바탕으로 유연성과 확장성이 뛰어난 코드 제작이 가능
- 객체의 자료형이 하위 클래스 의해서 결정됨
- 확장에 용이함
- 상위 클래스에서 그 객체에 대한 정확한 타입을 몰라도 된다.
- SOLID 원칙 중 DIP (Dependency Inversion Principle, 의존 관계 역전 원칙) 를 성립함
1.2. 단점
- 새로 생성할 객체의 종류가 늘어날 때마다, 클래스가 많아짐.
1.3. 활용 상황
- 딱히 구분없이 일반적으로 많이 사용됨.
- 대표적인 것이 JAVA 의 스프링 프레임워크.
2. 구조
3. 코드
메인에서, 사용자는 다음과 같이 사용할 수 있다.
// FactoryPatternDemo.java
public class FactoryPatternDemo {
public static void main(String[] args) {
// Shape 인스턴스를 생성해주는 팩토리를 만듭니다.
ShapeFactory shapeFactory = new ShapeFactory();
// 팩토리로부터 생성할 객체를 팩토리 메쏘드로 받습니다.
Shape shape1 = shapeFactory.getShape("CIRCLE");
shape1.draw();
Shape shape2 = shapeFactory.getShape("RECTANGLE");
shape2.draw();
}
}
뒷 단은 다음과 같이 구성되어 있다.
먼저, Factory 에서 만들어낼 상품(개체)들을 정의한다.
// Shape.java
// Shape 는 상위 클래스(인터페이스)로, 서브 클래스들은 모두 이에 의존하게 됩니다.
public interface Shape {
void draw();
}
// Circle.java
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
// Rectangle.java
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
이제, 이 상품들을 만들어 내보낼 팩토리를 정의한다.
// ShapeFactory.java
public class ShapeFactory {
// getShape(...) 를 통해 상품(Shape) 를 새로 만들어 내보냅니다.
public Shape getShape(String shapeType) {
if (ShapeType.equalsIgnoreCase("CIRCLE"))
return new Circle();
else if (ShapeType.equalsIgnoreCase("RECTANGLE"))
return new Rectangle();
else
return null
}
}