[매일코딩] 008 - 디자인패턴 - Factory Pattern

출처 및 관련 글

들어가기 앞서

패턴이라는 말에서 알 수 있듯, 무언가를 정형화 시켜 작업을 하면 알아보기도 쉽고 생산성을 늘릴 수 있습니다. 대신 그것을 만들기 위한 과정이 필요하긴 하죠 ...

요즘은 디자인 패턴을 모아 모아 ~ 프레임워크라는 더 큰 상위 개념을 만들어서 사용자에게 제공합니다. 그래서 첨에 뭐 배우는데 시간이 걸리긴 하지만 그래도 손쉽게? 앱을 만들 수 있도록 도와 줍니다.

예전 같았으면 여러 사람이 모여서 할 일을 더 적은 사람이 손쉽게 설정을 통해 화면이나 비즈니스 로직에만 집중하여 빠른 속도로 산출물을 만들 수 있게 돠주죠 :)

잡설이 길었네여 ㅎㅎ / 그래도 앞으로 소개할 디자인 패턴을 이해하고 활용하다 보면 헛 ! 이런 소리가 나올 것 입니다. 이미 알게 모르게 사용하고 있지요 ... 그럼 가즈아 ~

팩토리 패턴

팩토리 패턴은 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)를 만들어서 구현한 다음 나중에 상속받아서 구현해도 됩니다. (급한것부터 먼저 만들고 나중에 덜 중요한것 부터 차근차근 구현)

누군가를 ( 저 스스로 이겠지만 ㅋ ) 위해 오늘도 글을 남기네요 ~

Sort:  

@wonsama transfered 1.79 KRWP to @krwp.burn. voting percent : 6.97%, voting power : 79.29%, steem power : 1808422.38, STU KRW : 1200.
@wonsama staking status : 772.929 KRWP
@wonsama limit for KRWP voting service : 1.545 KRWP (rate : 0.002)
What you sent : 1.79 KRWP
Refund balance : 0.245 KRWP [44159126 - 8f9a1628efb26c6301022c94b639623b4279eca1]

이러니... 무플방지위원회 쉴수가 없네요!! ㅋㅋ
즐거운 불금 되세요~

헐 ㅋㅋㅋ 매번 감사합니다.

Coin Marketplace

STEEM 0.19
TRX 0.13
JST 0.029
BTC 66267.02
ETH 3282.53
USDT 1.00
SBD 2.70