CS

[Design Pattern] 팩토리 메서드(Factory method pattern)

KJihun 2023. 10. 23. 22:48
728x90

 

팩토리 메서드 패턴(Factory method pattern)

부모(상위) 클래스에 알려지지 않은 구체 클래스(new 키워드로 객체를 생성할 수 있는 클래스)를 생성하는 패턴이며, 자식(하위) 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴이기도 하다.

부모(상위) 클래스 코드에 구체 클래스 이름을 감추기 위한 방법으로도 사용한다.

Factory Method가 중첩되기 시작하면 굉장히 복잡해 질 수 있다. 또한 상속을 사용하지만 부모(상위) 클래스를 전혀 확장하지 않는다. 따라서 이 패턴은 extends 관계를 잘못 이용한 것으로 볼 수 있다. extends 관계를 남발하게 되면 프로그램의 엔트로피가 높아질 수 있으므로 Factory Method 패턴의 사용을 주의해야 한다.

 

// Product: 생성될 객체의 인터페이스 또는 추상 클래스
interface Animal {
    void makeSound();
}

// Concrete Product 1: 실제로 생성될 객체 1
class Dog implements Animal {
    public void makeSound() {
        System.out.println("멍멍!");
    }
}

// Concrete Product 2: 실제로 생성될 객체 2
class Cat implements Animal {
    public void makeSound() {
        System.out.println("야옹!");
    }
}

// Creator: 객체 생성을 담당하는 클래스 (추상 클래스 또는 인터페이스)
abstract class AnimalFactory {
    // 팩토리 메서드
    abstract Animal createAnimal();
    
    // 다른 작업을 수행하는 메서드들도 추가 가능
}

// Concrete Creator 1: 실제 객체 생성을 담당하는 클래스 1
class DogFactory extends AnimalFactory {
    Animal createAnimal() {
        return new Dog();
    }
}

// Concrete Creator 2: 실제 객체 생성을 담당하는 클래스 2
class CatFactory extends AnimalFactory {
    Animal createAnimal() {
        return new Cat();
    }
}

public class Main {
    public static void main(String[] args) {
        AnimalFactory dogFactory = new DogFactory();
        Animal myDog = dogFactory.createAnimal();
        myDog.makeSound();
        
        AnimalFactory catFactory = new CatFactory();
        Animal myCat = catFactory.createAnimal();
        myCat.makeSound();
    }
}

 

 

장점

1. 코드의 확장성과 유지보수성 향상

새로운 구체 클래스를 추가할 때마다 새로운 Factory 클래스만 작성하면 되므로, 코드의 확장성과 유지보수성이 향상된다


2. 부모 클래스와 구체 클래스 간의 결합도 감소

부모 클래스는 구체 클래스를 알 필요가 없다. 이로 인해 부모 클래스는 자식 클래스의 변경에 영향을 받지 않으며, 자식 클래스 역시 부모 클래스의 변경에 영향을 받지 않는다.

3. 구현의 중복 제거

객체 생성 로직이 여러 곳에서 사용될 때, 이를 하나의 메서드로 추상화하여 중복된 코드를 제거할 수 있다.

 

수정에 닫혀있고 확장에는 열려있는 OCP 원칙을 지킬 수 있다

 



단점


1. 추상화 레벨 증가

팩토리 메서드 패턴을 사용하면 더 많은 추상화 계층이 추가가 된다

2. 클래스 수 증가

각각의 구체 클래스마다 팩토리 클래스가 필요하기 때문에 클래스의 수가 늘어난다.

프로젝트가 커질수록 복잡성을 더욱 증가시킬 수 있다.


3. 설계의 복잡성

팩토리 메서드 패턴을 도입하면 더 많은 클래스와 인터페이스가 도입되어 설계를 복잡하게 할 수 있다.

 

 

간단한 기능을 사용할 때보다 많은 클래스를 정의해야 하기 때문에 코드량이 증가한다.

 

 

 

팩토리 메서드

객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스가 내리도록 하는 패턴팩토리 메소드란 쉽게 말하면 객체를 생성 반환하는 메서

velog.io