팩토리 패턴(factory pattern)

dlrmawn·2023년 12월 11일

CS

목록 보기
2/7
post-thumbnail

팩토리 패턴(factory pattern)

소프트웨어 디자인 패턴 중 하나로, 객체 생성을 캡슐화하여 객체의 생성 방식을 결정하는 패턴
상위 클래스가 중요한 뼈대를 결정, 하위 클래스에사 객체 생성에 대한 구체적인 내용을 결정한다.

정적 팩토리 패턴 VS 추상 팩토리 패턴

둘 다 객체 생성에 관한 디자인 패턴이지만, 목적과 구조에서 차이가 있다.


정적 팩토리 패턴 (Static Factory Pattern)

목적
객체 생성을 한 곳에서 담당하는 정적 메서드(클래스 메서드)를 제공함으로써, 객체 생성에 대한 코드를 클라이언트로부터 분리하여 객체 생성 방식을 캡슐화합니다.

구조
단일 클래스 내에 정적 메서드로 객체를 생성하는 방식입니다.
생성자를 직접 호출하는 대신 정적 메서드를 사용하여 객체를 얻습니다.

장점
이름을 가질 수 있어, 클라이언트 코드가 명시적이고 가독성이 높아집니다.
생성 로직을 캡슐화하여 변경에 유연하게 대처할 수 있습니다.

단점
유연성이 떨어질 수 있습니다. 정적 메서드를 확장하려면 새로운 메서드를 추가해야 합니다.
구현이 하나의 클래스 내에 있기 때문에, 이 구조를 통해 생성되는 객체들 간의 관계가 강력하게 결합될 수 있습니다.
예를 들면, 자바의 java.util.Collections 클래스는 정적 팩토리 메서드를 제공하는데, List 객체를 생성하는 emptyList()나 singletonList() 등이 해당합니다.

// 도형 인터페이스
interface Shape {
    void draw();
}

// 구체적인 도형 클래스들
class Circle implements Shape {
    public void draw() {
        System.out.println("원을 그립니다.");
    }
}

class Square implements Shape {
    public void draw() {
        System.out.println("사각형을 그립니다.");
    }
}

// 도형을 생성하는 클래스
public class ShapeFactory {
    // 정적 팩토리 메소드 - 도형 생성
    public static Shape createShape(String type) {
        if ("Circle".equalsIgnoreCase(type)) {
            return new Circle();
        } else if ("Square".equalsIgnoreCase(type)) {
            return new Square();
        }
        return null;
    }

    public static void main(String[] args) {
        // 정적 팩토리 메소드를 이용한 객체 생성
        Shape circle = ShapeFactory.createShape("Circle");
        Shape square = ShapeFactory.createShape("Square");

        // 객체 정보 출력
        circle.draw();  // 원을 그립니다.
        square.draw();  // 사각형을 그립니다.
    }
}
ShapeFactory 클래스에 정적 팩토리 메소드인 createShape를 추가했습니다. 
클라이언트 코드에서는 팩토리 클래스를 인스턴스화하지 않고도 정적 메소드를 통해 도형 객체를 생성할 수 있습니다. 
이것이 정적 팩토리 메소드 패턴의 특징 중 하나입니다.


추상 팩토리 패턴 (Abstract Factory Pattern)

목적
여러 제품군(관련된 객체 집합)을 생성하는 인터페이스를 제공하며, 각각의 구체 팩토리 클래스는 하나의 제품군을 생성합니다.
클라이언트가 어떤 구체 팩토리를 사용할지는 런타임에 결정됩니다.

구조
추상 팩토리 인터페이스가 제품 객체를 생성하는 메서드를 선언합니다.
각각의 구체 팩토리 클래스는 해당 제품군을 생성하는 구현을 제공합니다.

장점
제품군 간의 일관성을 유지하면서 객체를 생성할 수 있습니다.
클라이언트는 어떤 구체 팩토리를 사용할지 몰라도 됩니다.

단점
새로운 제품이나 제품군을 추가하기 어려울 수 있습니다.

// 도형 인터페이스
interface Shape {
    void draw();
}

// 구체적인 도형 클래스들
class Circle implements Shape {
    public void draw() {
        System.out.println("원을 그립니다.");
    }
}

class Square implements Shape {
    public void draw() {
        System.out.println("사각형을 그립니다.");
    }
}

// 추상 팩토리 인터페이스
interface ShapeFactory {
    Shape createShape();
}

// 구체적인 팩토리 클래스들
class CircleFactory implements ShapeFactory {
    public Shape createShape() {
        return new Circle();
    }
}

class SquareFactory implements ShapeFactory {
    public Shape createShape() {
        return new Square();
    }
}

public class AbstractFactoryExample {
    public static void main(String[] args) {
        // 추상 팩토리를 이용한 객체 생성
        ShapeFactory circleFactory = new CircleFactory();
        ShapeFactory squareFactory = new SquareFactory();

        // 도형 객체 생성
        Shape circle = circleFactory.createShape();
        Shape square = squareFactory.createShape();

        // 객체 정보 출력
        circle.draw();  // 원을 그립니다.
        square.draw();  // 사각형을 그립니다.
    }
}

ShapeFactory라는 추상 팩토리 인터페이스를 도입하고, 각 도형에 대한 구체적인 팩토리 클래스 CircleFactory와 SquareFactory를 생성합니다. 
클라이언트 코드에서는 필요에 따라 적절한 팩토리를 선택하여 도형 객체를 생성합니다. 
이렇게 함으로써 도형 객체 생성에 대한 구체적인 구현을 추상화하고, 클라이언트 코드는 도형의 타입을 명시적으로 지정하지 않고도 해당 도형을 생성할 수 있습니다.







참고
면접을 위한 cs 전공지식 노트

profile
수정해야 할 내용 있으면 메일 부탁드립니다! ⍥

0개의 댓글