팩토리 패턴은 생성패턴(Creational Pattern) 중 하나이다.
생성 패턴은 인스턴스를 만드는 절차를 추상화하는 패턴이다.
생성 패턴에 속하는 패턴들은 객체를 생성, 합성하는 방법이나 객체의 표현방법을 시스템과 분리해준다. 생성 패턴은 시스템이 상속보다 복합방법을 사용하는 방향으로 진화되어 가면서 더 중요해지고 있다.
생성 패턴에는 중요한 이슈가 2가지 있다.
이 두가지를 정리해보면, 생성 패턴을 이용하여 무엇이 생성되고, 누가, 어떻게, 언제 육하원칙 비슷하게 결정하는데에 유연성을 확보할 수 있다.
팩토리 패턴은 객체를 생성하는 인터페이스를 미리 정의하지만, 인스턴스를 만들 클래스의 결정은 서브 클래스 쪽에서 결정하는 패턴이다. 여러개의 서브 클래스를 가진 슈퍼 클래스가 있을때, 들어오는 인자에 따라서 하나의 자식클래스의 인스턴스를 반환해주는 방식이다.
팩토리 패턴은 클래스의 인스턴스를 만드는 시점 자체를 서브 클래스로 미루는 것이다.
활용성
Figure.java
public interface Figure {
void draw();
}
Circle.java
public class Circle implements Figure {
@Override
public void draw() {
System.out.println("Circle의 draw 메소드");
}
}
Rectangle.java
public class Rectangle implements Figure {
@Override
public void draw() {
System.out.println("Rectangle의 draw 메소드");
}
}
Square.java
public class Square implements Figure {
@Override
public void draw() {
System.out.println("Square의 draw 메소드");
}
}
FigureFactory
public class FigureFactory {
public Figure getFigure(String figureType) {
if(figureType == null) {
return null;
}
if(figureType.equalsIgnoreCase("CIRCLE") {
return new Circle();
} else if (figureType.equalsIgnoreCase("RECTANGLE") {
return new Rectangle();
} else if (figureType.equalsIgnoreCase("SQUARE") {
return new Square();
}
return null;
}
}
여기서 equalsIgnoreCase()
는 앞에 매개변수인 figureType의 문자열과 대소문자 구분을 하지않고 뒤의 문자열과 일치하면 true
를 반환해준다.
FactoryPattern.java
public class FactoryPattern {
public static void main(String[] args) {
FigureFactory figureFactory = new FigureFactory();
Figure fig1 = figureFactory.getFigure("CIRCLE");
// Circle의 draw 메소드 호출
fig1.draw();
Figure fig2= figureFactory.getFigure("RECTANGLE");
// Rectangle의 draw 메소드 호출
fig2.draw();
Figure fig3 = figureFactory.getFigure("SQUARE");
// Square의 draw 메소드 호출
fig3.draw();
}
}
팩토리 패턴은 클라이언트 코드로부터 서브 클래스의 인스턴스화를 제거하여 서로 간의 종속성을 낮추고, 결합도를 느슨하게 하며(Loosely Coupled), 확장을 쉽게 한다.
팩토리 패턴은 클라이언트와 구현 객체들 사이에 추상화를 제공한다.