본문 바로가기

java(자바)

[java(자바)] 팩토리 패턴 _디버깅의 눈물

팩토리 패턴(Factory Pattern)은 객체를 생성하는 디자인 패턴 중 하나입니다. 이 패턴은 객체 생성을 캡슐화하여 객체 생성 과정에서 발생하는 복잡성을 숨기고, 클라이언트 코드에서 객체를 생성하는 것을 단순화합니다.

 

팩토리 패턴을 사용하면 객체 생성 코드를 클라이언트 코드와 분리할 수 있습니다. 클라이언트 코드에서는 생성할 객체의 타입을 지정하고, 팩토리 클래스에게 객체 생성을 요청합니다. 팩토리 클래스는 이 요청에 따라 객체를 생성하여 클라이언트 코드에 반환합니다.

 

팩토리 패턴은 일반적으로 인터페이스를 정의하고, 인터페이스를 구현하는 클래스를 사용하여 객체를 생성합니다. 이렇게 하면 클라이언트 코드는 인터페이스를 통해 객체를 요청할 수 있으며, 팩토리는 해당 인터페이스를 구현하는 클래스의 인스턴스를 생성하여 반환합니다. 따라서 클라이언트 코드는 객체 생성 과정을 알 필요 없이 인터페이스를 사용하여 객체에 액세스할 수 있습니다.

 

다음은 자바(Java) 언어를 사용하여 구현한 간단한 팩토리 패턴의 예시입니다.

 

예를 들어, 쉐이프(Shape) 인터페이스를 구현한 각각의 도형(원, 사각형, 삼각형 등) 클래스가 있고, 이를 생성하는 팩토리 클래스를 구현하고자 한다고 가정해봅시다.

 

우선, 쉐이프 인터페이스를 정의합니다.

 

 

public interface Shape {
    void draw();
}

 

 

다음으로, 이 인터페이스를 구현한 각각의 도형 클래스를 정의합니다.

 

 

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Inside Circle::draw() method.");
    }
}

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 ShapeFactory {
    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;
    }
}

 

 

위의 팩토리 클래스에서는 getShape() 메서드를 사용하여 클라이언트 코드에서 요청한 도형 타입에 해당하는 객체를 생성하고 반환합니다.

 

이제, 클라이언트 코드에서는 다음과 같이 팩토리 클래스를 사용하여 도형 객체를 생성하고 사용할 수 있습니다.

 

 

public class Client {
    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();
    }
}

 

 

 

위의 예시에서는 클라이언트 코드에서는 객체를 직접 생성하지 않고, 팩토리 클래스를 사용하여 객체를 생성하고 이를 추상화한 인터페이스를 사용하여 객체에 액세스합니다. 따라서, 팩토리 패턴을 사용함으로써 객체 생성과 사용 사이의 의존성이 줄어들고, 유연성과 확장성이 향상됩니다.

 

 

팩토리 패턴의 장점으로는 유연성, 확장성, 코드 재사용성 등이 있습니다. 예를 들어, 클라이언트 코드에서는 객체 생성 코드를 수정하지 않고도 새로운 객체를 생성하도록 팩토리 클래스를 변경할 수 있습니다. 이는 코드 유지 보수 및 개발의 용이성을 높여줍니다. 또한, 팩토리 패턴을 사용하면 객체 생성 코드를 중앙 집중화할 수 있기 때문에 코드 중복을 줄일 수 있습니다.

 

단점으로는 객체를 생성하는 과정에서 성능 저하가 발생할 수 있다는 것이 있습니다. 이는 팩토리 클래스에서 객체를 생성하는 과정이 복잡하거나, 생성되는 객체의 수가 많아질수록 영향을 미칩니다. 따라서, 팩토리 패턴을 사용할 때는 이러한 성능 이슈를 고려하여 구현해야 합니다.