디자인 패턴 - Abstract Factory Pattern

Table of Contents

출처 : https://www.tutorialspoint.com/design_pattern/abstract_factory_pattern.htm

Abstract Factory 패턴은 다른 팩토리를 생성하는 슈퍼 팩토리를 중심으로 작동합니다. 이 공장은 공장의 공장이라고도합니다. 이 패턴은 객체를 생성하는 가장 좋은 방법 중 하나를 제공하기 때문에 이러한 유형의 디자인 패턴은 생성 패턴에 속합니다.

Abstract Factory 패턴에서 인터페이스는 클래스를 명시적으로 지정하지 않고 관련 객체의 팩토리를 생성하는 역할을 합니다. 생성된 각 팩토리는 팩토리 패턴에 따라 객체를 제공할 수 있습니다.

Implementation

Shape 인터페이스와 이를 구현하는 구체적인 클래스를 만들 것입니다. 다음 단계로 추상 팩토리 클래스 AbstractFactory를 생성합니다. AbstractFactory를 확장하는 팩토리 클래스 ShapeFactory가 정의되어 있습니다. 팩토리 생성자/생성기 클래스 FactoryProducer가 생성됩니다.

AbstractFactoryPatternDemo, 데모 클래스는 FactoryProducer를 사용하여 AbstractFactory 객체를 가져옵니다. 필요한 객체 유형을 얻기 위해 AbstractFactory에 정보(모양의 경우 CIRCLE / RECTANGLE / SQUARE)를 전달합니다.

Abstract Factory Pattern UML Diagram

Step 1

Shapes에 대한 인터페이스를 만듭니다.

Shape.java

1public interface Shape {
2   void draw();
3}

Step 2

동일한 인터페이스를 구현하는 구체적인 클래스를 만듭니다.

RoundedRectangle.java

1public class RoundedRectangle implements Shape {
2   @Override
3   public void draw() {
4      System.out.println("Inside RoundedRectangle::draw() method.");
5   }
6}

RoundedSquare.java

1public class RoundedSquare implements Shape {
2   @Override
3   public void draw() {
4      System.out.println("Inside RoundedSquare::draw() method.");
5   }
6}

Rectangle.java

1public class Rectangle implements Shape {
2   @Override
3   public void draw() {
4      System.out.println("Inside Rectangle::draw() method.");
5   }
6}

Step 3

일반 및 둥근 모양 개체에 대한 공장을 가져오는 추상 클래스를 만듭니다.

AbstractFactory.java

1public abstract class AbstractFactory {
2   abstract Shape getShape(String shapeType) ;
3}

Step 4

주어진 정보를 기반으로 구체적인 클래스의 객체를 생성하기 위해 AbstractFactory를 확장하는 Factory 클래스를 생성합니다.

ShapeFactory.java

 1public class ShapeFactory extends AbstractFactory {
 2   @Override
 3   public Shape getShape(String shapeType){
 4      if(shapeType.equalsIgnoreCase("RECTANGLE")){
 5         return new Rectangle();
 6      }else if(shapeType.equalsIgnoreCase("SQUARE")){
 7         return new Square();
 8      }
 9      return null;
10   }
11}

RoundedShapeFactory.java

 1public class RoundedShapeFactory extends AbstractFactory {
 2   @Override
 3   public Shape getShape(String shapeType){
 4      if(shapeType.equalsIgnoreCase("RECTANGLE")){
 5         return new RoundedRectangle();
 6      }else if(shapeType.equalsIgnoreCase("SQUARE")){
 7         return new RoundedSquare();
 8      }
 9      return null;
10   }
11}

Step 5

Shape와 같은 정보를 전달하여 Factory를 얻기 위한 Factory 생성자/생산자 클래스를 만듭니다.

FactoryProducer.java

1public class FactoryProducer {
2   public static AbstractFactory getFactory(boolean rounded){
3      if(rounded){
4         return new RoundedShapeFactory();
5      }else{
6         return new ShapeFactory();
7      }
8   }
9}

Step 6

유형과 같은 정보를 전달하여 구체적인 클래스의 팩토리를 가져오기 위해 FactoryProducer를 사용하여 AbstractFactory를 가져옵니다.

AbstractFactoryPatternDemo.java

 1public class AbstractFactoryPatternDemo {
 2   public static void main(String[] args) {
 3      //get shape factory
 4      AbstractFactory shapeFactory = FactoryProducer.getFactory(false);
 5      //get an object of Shape Rectangle
 6      Shape shape1 = shapeFactory.getShape("RECTANGLE");
 7      //call draw method of Shape Rectangle
 8      shape1.draw();
 9      //get an object of Shape Square
10      Shape shape2 = shapeFactory.getShape("SQUARE");
11      //call draw method of Shape Square
12      shape2.draw();
13      //get shape factory
14      AbstractFactory shapeFactory1 = FactoryProducer.getFactory(true);
15      //get an object of Shape Rectangle
16      Shape shape3 = shapeFactory1.getShape("RECTANGLE");
17      //call draw method of Shape Rectangle
18      shape3.draw();
19      //get an object of Shape Square
20      Shape shape4 = shapeFactory1.getShape("SQUARE");
21      //call draw method of Shape Square
22      shape4.draw();
23
24   }
25}

Step 7

출력을 확인합니다.

1Inside Rectangle::draw() method.
2Inside Square::draw() method.
3Inside RoundedRectangle::draw() method.
4Inside RoundedSquare::draw() method.

이 시리즈의 게시물