본문 바로가기
정리 중/Java Design Pattern

Factory Pattern

by Flow.X 2022. 1. 23.
728x90

Java 디자인 패턴 중 가장 많이 사용되는 패턴 중 하나이다.

객체를 만들때 만드는 로직을 노출할 필요없이 공통 인터페이스를 통해 생성 한다. 

 

원을 그리고 싶은데 도형을 그리는 함수에서 정 사각형을 그릴 수 있는 함수를 가져와서 사용하는 예제이다.

실제 main 함수에서 보면  정사각형을 그리는 함수는 직접 나타나지 않고, 

도형을 그리는 함수만 표시된다. 

구현

1) 도형이라는 interface를 하나 만들고, 공통 인터페이스인 draw를 하나 정의한다.

2) 도형 인터페이스를 가진 원, 사각형을 만든다.

3) ShapeFactory를 만들고 해당 함수에서 받은 인자로, 원 또는 사각형을 리턴한다.

public class FactoryPattern {

    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ShapeFactory();

        Shape shape1 = shapeFactory.createShape("SQUARE"); //정사각형을 가져와라
        shape1.draw();

        Shape shape2 = shapeFactory.createShape("RECTANGLE"); //사각형을 가져와라
        shape2.draw();
    }
}

interface Shape { //도형의 Interface
    public void draw();
}

class Square implements Shape { //도형의 interface를 가지는 정사각형
    @Override
    public void draw() {
        System.out.println("정사각형이다.");
    }
}

class Rectangle implements Shape { //도형의 인터페이스를 가지는 사각형

    @Override
    public void draw() {
        System.out.println("사각형이다.");
    }
}

class ShapeFactory { //Factory Pattern의 핵심이다. 

    public Shape createShape(String shapeType) {
        if (shapeType.equalsIgnoreCase("SQUARE")) {
            return new Square();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        }
        return null;
    }
}

 

Abstract Factory Pattern

앞에는 정사각형을 그리기 위해서 도형그리는 class를 가져와서 정사각형 함수를 그린것이다.

 

정사각형, 사각형 외에 라운드된 정사각형,  라운드된 직사각형 추가되었다고 하자.

라운드된 사각형끼리 하나의 공장으로 묶고, 라운드 안된 사각형끼리 하나의 공장으로 묶어보자

 

ShapeFactory

정사각형, 사각형끼리 묶인 Factory이고 일반 사각형 class를 리턴

 

RoundShapeFactory

라운드된 정사각형, 사각형 Factory이고 라운드 된 사각형 class를 리턴

 

FactoryProducer

ShapeFactory 인지 , RoundFactory인지 리턴 

 

public class FactoryPattern {

    public static void main(String[] args) {

        //라운드를 그리는 클래스를 갖고 온다. 
        AbstractFactory abstractFactory = FactoryProducer.getFactory(true);
        
        Shape shape1 = abstractFactory.getShape("SQUARE");
        abstractFactory.draw();

        AbstractFactory abstractFactory2 = FactoryProducer.getFactory(false);

        Shape shape2 = abstractFactory2.getShape("RECTANGLE");
        abstractFactory2.draw();
    }
}

//라운드된 공장을 가져올지, 아닐지 결정하는 상위 공장을 하나 만들었다.
class FactoryProducer {
    public static AbstractFactory getFactory(boolean rounded){
        if(rounded){
            return new RoundedShapeFactory();
        }else{
            return new ShapeFactory();
        }
    }
}

//추가된 라운드 형태를 가지는 shape에 대한 처리를 위해 최상위 클래스
abstract class AbstractFactory {
    abstract Shape getShape(String shapeType);
}

//라운드 안된 도형을 만드는 class리턴
class ShapeFactory extends AbstractFactory { // Factory Pattern의 핵심이다.
    @Override
    Shape getShape(String shapeType) {
        if (shapeType.equalsIgnoreCase("SQUARE")) {
            return new Square();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        }
        return null;
    }
}

//라운드된 도형을 만드는 class 리턴 
class RoundedShapeFactory extends AbstractFactory { // Factory Pattern의 핵심이다.
    @Override
    Shape getShape(String shapeType) {
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new RoundedSquare();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new RoundedRectangle();
        }
        return null;
    }
}

interface Shape {
    public void draw();
}

class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("정사각형이다.");
    }
}


//라운드된 정사각형 함수
class RoundedSquare implements Shape {
    @Override
    public void draw() {
        System.out.println("라운드 된 정사각형이다.");
    }
}

class Rectangle implements Shape {

    @Override
    public void draw() {
        System.out.println("사격형이다.");
    }
}


//라운드 된 사각형 함수 
class RoundedRectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("라운드 된 사격형이다.");
    }
}

 

728x90