출처 및 관련 글
들어가기 앞서
패턴이라는 말에서 알 수 있듯, 무언가를 정형화 시켜 작업을 하면 알아보기도 쉽고 생산성을 늘릴 수 있습니다. 대신 그것을 만들기 위한 과정이 필요하긴 하죠 ...
요즘은 디자인 패턴을 모아 모아 ~ 프레임워크라는 더 큰 상위 개념을 만들어서 사용자에게 제공합니다. 그래서 첨에 뭐 배우는데 시간이 걸리긴 하지만 그래도 손쉽게? 앱을 만들 수 있도록 도와 줍니다.
예전 같았으면 여러 사람이 모여서 할 일을 더 적은 사람이 손쉽게 설정을 통해 화면이나 비즈니스 로직에만 집중하여 빠른 속도로 산출물을 만들 수 있게 돠주죠 :)
잡설이 길었네여 ㅎㅎ / 그래도 앞으로 소개할 디자인 패턴을 이해하고 활용하다 보면 헛 ! 이런 소리가 나올 것 입니다. 이미 알게 모르게 사용하고 있지요 ... 그럼 가즈아 ~
팩토리 패턴
팩토리 패턴은 Java에서 가장 많이 사용되는 디자인 패턴 중 하나입니다. 이 유형의 디자인 패턴은 객체를 생성하는 가장 좋은 방법 중 하나를 제공하므로 생성 패턴에 속합니다.
1단계
인터페이스 만들기
public interface Shape {
void draw();
}
그리기 함수를 가진 도형의 인터페이스 생성
2단계
동일한 인터페이스를 구현하는 구체적인 클래스를 만듭니다.
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
그리기 기능을 가진 직사각형, 정사각형, 원 생성
3단계
주어진 정보를 기반으로 구체적인 클래스의 객체를 생성하는 팩토리를 만듭니다.
public class ShapeFactory {
//use getShape method to get object of type shape
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;
}
}
팩토리를 만들고 도형을 입력받은 조건에 따라 생성하도록 합니다.
4단계
팩토리를 사용하여 유형과 같은 정보를 전달하여 구체적인 클래스의 객체를 가져옵니다.
public class FactoryPatternDemo {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
// 원 개체를 가져오고, 그리기 메소드를 호출한다
Shape shape1 = shapeFactory.getShape("CIRCLE");
// 원의 그리기 메소드 호출
shape1.draw();
// 직사각형 개체를 가져오고, 그리기 메소드를 호출한다
Shape shape2 = shapeFactory.getShape("RECTANGLE");
// 직사각형의 그리기 메소드 호출
shape2.draw();
// 정사각형 개체를 가져오고, 그리기 메소드를 호출한다
Shape shape3 = shapeFactory.getShape("SQUARE");
// 정사각형의 그리기 메소드 호출
shape3.draw();
}
}
결과물
Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.
맺음말
- 정말 중요한 패턴 입니다.
- 위 같은경우 Shape 의 종류가 늘어나는 경우 손쉽게 확장이 가능합니다. ( Shape 를 implements 한 Triangle 생성 ... )
- 기능을 추가하고 싶은 경우 interface 에 method 를 추가하고 추가된 기능을 구현하면 됩니다.
- 이때 모든걸 바로 추가하기 어려운 경우 중간에 추상 클래스(abstract class)를 만들어서 구현한 다음 나중에 상속받아서 구현해도 됩니다. (급한것부터 먼저 만들고 나중에 덜 중요한것 부터 차근차근 구현)
누군가를 ( 저 스스로 이겠지만 ㅋ ) 위해 오늘도 글을 남기네요 ~