Design Pattern/생성 패턴

Abstract Factory Pattern

추상 팩토리 패턴

서로 관련이 있는 객체들을 통째로 묶어서 팩토리 클래스로 만들고, 이들 팩토리를 조건에 따라 생성하도록 다시 팩토리를 만들어서 객체를 생성하는 패턴

 

간단하게 생각하면 팩토리를 추상화 해서 교체하기 쉽게 만드는 패턴이라고 보면된다.

 

1. Shape 인터페이스

public interface Shape {
    void draw();
}

 

2. Shape를 상속받은 모형 구현

public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("직사각형을 그렸습니다.");
    }
}
public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("정사각형을 그렸습니다.");
    }
}
public class RoundedRectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Rounded 직사각형을 그렸습니다.");
    }
}
public class RoundedSquare implements Shape {
    @Override
    public void draw() {
        System.out.println("Rounded 정사각형을 그렸습니다.");
    }
}

 

3. 추상 팩토리 클래스 

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

 

4. 추상 팩토리 클래스를 상속 받은 팩토리 구현

public class ShapeFactory extends AbstractFactory{
    public Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        switch (shapeType) {
            case "SQUARE" :
                return new Square();
            case "RECTANGLE" :
                return new Rectangle();
            default:
                return null;
        }
    }
}
public class RoundedShapeFactory extends AbstractFactory{
    public Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        switch (shapeType) {
            case "SQUARE" :
                return new RoundedSquare();
            case "RECTANGLE" :
                return new RoundedRectangle();
            default:
                return null;
        }
    }
}

 

5. 팩토리 생성 클래스

public class FactoryProducer {
    public static AbstractFactory getFactory(boolean rounded){
        if(rounded){
            return new RoundedShapeFactory();
        }else{
            return new ShapeFactory();
        }
    }
}

 

6. main()

public class AbstractFactoryPatternDemo {
    public static void main(String[] args) {
        AbstractFactory shapeFactory = FactoryProducer.getFactory(false);

        Shape shape1 = shapeFactory.getShape("RECTANGLE");
        print(shape1);
        Shape shape2 = shapeFactory.getShape("SQUARE");
        print(shape2);
        Shape shape3 = shapeFactory.getShape("abc");
        print(shape3);
        Shape shape4 = shapeFactory.getShape(null);
        print(shape4);

        AbstractFactory shapeFactory1 = FactoryProducer.getFactory(true);

        Shape shape5 = shapeFactory1.getShape("RECTANGLE");
        print(shape5);
        Shape shape6 = shapeFactory1.getShape("SQUARE");
        print(shape6);
        Shape shape7 = shapeFactory1.getShape("abc");
        print(shape7);
        Shape shape8 = shapeFactory1.getShape(null);
        print(shape8);
    }

    public static void print(Shape shape) {
        if (shape != null) {
            shape.draw();
        }else {
            System.out.println("올바르지않은 모형");
        }
    }
}

7. 결과

직사각형을 그렸습니다.
정사각형을 그렸습니다.
올바르지않은 모형
올바르지않은 모형
Rounded 직사각형을 그렸습니다.
Rounded 정사각형을 그렸습니다.
올바르지않은 모형
올바르지않은 모형

 

보면서 FactoryProducer가 의아 하신분들이 있을거 같은데 이유는 간단하게 프레임워크에서는 해당 팩토리를 DI해주기때문에 일거라고 생각합니다. 

(스프링 프레임워크 기준으로 ioc 컨테이너가 관리하는 bean을 DI한다.)

Reference

www.tutorialspoint.com/design_pattern/abstract_factory_pattern.htm

 

'Design Pattern > 생성 패턴' 카테고리의 다른 글

prototype pattern  (0) 2021.04.13
Builder Pattern  (0) 2021.04.13
Singleton Pattern  (0) 2021.04.12
Factory Pattern  (0) 2021.04.12