객체를 사용하는 코드에서 객체 생성 부분을 뗴어내 추상화한 패턴이자 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는
패턴이다.
상위 클래스와 하위 클래스가 분리되기 때문에 느슨한 결합을 가지며, 상위 클래스에서는 인스턴스 생성 방식에 대해 전혀 알 필요가 없기 때문에 더 많은 유연성을 갖게 됩니다.
그리고 객체 생성 로직이 따로 떼어져 있기 때문에 코드를 리팩터링하더라도 한 곳만 고칠 수 있게 되어 유지 보수성이 증가됨.
shape.java
public interface Shape {
void draw();
}
Circle.java
public class Circle implements Shape{
@Override
public void draw() {
System.out.println("Circle - draw() Method.");
}
}
Rectangle.java
public class Rectangle implements Shape{
@Override
public void draw() {
System.out.println("Rectangle - draw() Method.");
}
}
Square.java
public class Square implements Shape{
@Override
public void draw() {
System.out.println("Square - draw() Method.");
}
}
ShapeFactory.java
public class ShapeFactory {
//팩토리 메소드 - 객체 생성 후 반환
public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
} else if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
} else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
}
FactoryPatternTest.java
public class FactoryPatternTest {
public static void main(String[] args) {
//팩토리 클래스에서 객체를 생성 후 반환
ShapeFactory shapeFactory = new ShapeFactory();
Shape shape1 = shapeFactory.getShape("CIRCLE");
//Circle 메소드 호출
shape1.draw();
Shape shape2 = shapeFactory.getShape("RECTANGLE");
//Rectangle 메소드 호출
shape2.draw();
Shape shape3 = shapeFactory.getShape("SQUARE");
//Square 메소드 호출
shape3.draw();
}
}