본문 바로가기
정보모음

자바 디자인 패턴: 팩토리 메서드 패턴 이해하기

by 창진이의정보글 2023. 6. 14.

1. 기본 개념 이해하기

 

 

 

팩토리 메서드 패턴은 객체 생성 지점을 클라이언트로부터 분리하여 객체 생성을 하위 클래스에 위임하는 방식의 디자인 패턴이다. 이 패턴은 객체 생성 코드를 추상화하여 클라이언트는 구체적인 클래스가 아닌 추상화된 인터페이스에 의존하게 된다. 이를 통해 클라이언트는 객체 생성에 대한 구체적인 구현을 알 필요 없이 객체를 생성하여 사용할 수 있다.

 

팩토리 메서드 패턴에서는 일반적으로 Creator(객체 생성자)와 ConcreteCreator(구체적인 객체 생성자)가 있으며, 이를 직접 구현하여 사용할 때 보다 추상화된 팩토리 인터페이스를 사용하는 것이 좋다. 이를 통해 필요에 따라 객체 생성 방식을 쉽게 바꿀 수 있기 때문이다.

 

팩토리 메서드 패턴은 객체 생성 방식의 변화에 유연하게 대처하기 위해 사용한다. 서브클래스 즉 하위 클래스에서 객체 생성을 담당하므로, 객체 생성 방식이 변경되더라도 Creator 클래스의 로직 변경 없이 ConcreteCreator 클래스를 새로 추가하여 대응할 수 있다. 이를 통해 코드의 유지보수성과 확장성을 높일 수 있다.

 

 

 

2. 구현 방법 소개하기

 

 

 

팩토리 메서드 패턴을 구현하는 방법은 다음과 같다.

 

1) 추상 팩토리 클래스 정의

 

추상 팩토리 클래스는 객체 생성을 위한 팩토리 메서드를 정의하는 인터페이스를 제공한다. 즉, 팩토리 메서드를 사용해 객체 생성을 구현하는 구상 클래스가 구현해야 하는 인터페이스이다.

 

2) 구상 팩토리 클래스 구현

 

추상 팩토리 클래스를 상속하여 객체 생성을 위한 구상 메서드를 구현한다. 이때, 구상 클래스에서 구현한 팩토리 메서드는 객체를 생성하고 반환한다.

 

3) 객체 생성을 위한 추상 메서드 정의

 

추상 팩토리 클래스에서는 객체 생성을 위한 추상 메서드를 정의한다. 이 추상 메서드는 구상 클래스에서 구현되어야 한다.

 

4) 객체 생성

 

객체를 생성하기 위해서는 구상 팩토리 클래스를 이용해 객체를 생성한다. 이때, 추상 팩토리 클래스에서 정의한 추상 메서드를 구상 클래스에서 구현해야 한다.

 

5) 클라이언트 코드 작성

 

클라이언트는 팩토리 메서드를 사용해 객체를 생성하는데 이때, 추상 팩토리 클래스를 사용한다. 이렇게 하면 구상 클래스가 아닌 추상 팩토리 클래스를 사용하여 객체를 생성하므로, 유연성이 증가한다.

 

6) 팩토리 메서드 패턴의 장점

 

팩토리 메서드 패턴의 장점은 다음과 같다.

 

- 객체 생성을 추상화할 수 있다.

 

- 객체 생성에 대한 구체적인 부분과 추상적인 부분을 분리할 수 있다.

 

- 클래스 간의 결합도가 낮아져 유지보수성과 재사용성이 좋아진다.

 

- 클라이언트가 구상 클래스를 사용하지 않고 추상 클래스를 사용하므로 유연성과 확장성이 좋아진다.

 

 

 

3. 예시 코드 살펴보기

 

 

 

예시 코드 살펴보기:

 

```

 

interface Animal {

 

public void sound();

 

}

 

class Dog implements Animal {

 

@Override

 

public void sound() {

 

System.out.println("멍멍");

 

}

 

}

 

class Cat implements Animal {

 

@Override

 

public void sound() {

 

System.out.println("야옹");

 

}

 

}

 

abstract class AnimalFarm {

 

public abstract Animal newAnimal();

 

}

 

class DogFarm extends AnimalFarm {

 

@Override

 

public Dog newAnimal() {

 

System.out.println("강아지 탄생!");

 

return new Dog();

 

}

 

}

 

class CatFarm extends AnimalFarm {

 

@Override

 

public Cat newAnimal() {

 

System.out.println("고양이 탄생!");

 

return new Cat();

 

}

 

}

 

public class Main {

 

public static void main(String[] args) {

 

AnimalFarm animalFarm = new DogFarm();

 

Animal animal = animalFarm.newAnimal();

 

animal.sound();

 

animalFarm = new CatFarm();

 

animal = animalFarm.newAnimal();

 

animal.sound();

 

}

 

}

 

```

 

위 코드에서는 Animal 인터페이스를 구현한 Dog와 Cat 클래스, 그리고 AnimalFarm 추상 클래스와 이를 상속받은 DogFarm과 CatFarm 클래스가 존재합니다.

 

AnimalFarm은 newAnimal() 메서드를 추상 메서드로 가지고 있으며, 각 동물의 탄생을 담당하는 DogFarm과 CatFarm 클래스에서 각각 이 메서드를 구현합니다.

 

main() 메서드에서는 DogFarm에서 Dog 클래스를 생성하고, 이를 animal 변수에 대입하여 sound() 메서드를 실행시킵니다. 그리고 CatFarm에서 Cat 클래스를 생성하고, 이를 animal 변수에 대입하여 마찬가지로 sound() 메서드를 실행시킵니다.

 

이런식으로 팩토리 메서드 패턴을 이용하면 추상적인 개념인 Animal 이라는 클래스와 구체적인 Dog, Cat 클래스를 완전히 분리시키면서도, 매우 적은 수정으로 새로운 동물이 추가될 경우에 코드 변화를 최소화할 수 있습니다.

 

 

 

4. 장단점 분석하기

 

 

 

해당 블로그 글의 팩토리 메서드 패턴에 대한 장단점을 분석해보면 다음과 같다.

 

장점:

 

1. 유연성: 객체 생성 로직을 하위 클래스에서 구현할 수 있으므로 팩토리 메서드 패턴은 유연성이 뛰어나다. 즉, 객체 생성 방식이 바뀌더라도 코드의 수정 없이도 구체적인 클래스를 교체할 수 있다.

 

2. 확장성: 새로운 객체를 추가할 때 마다 관련된 클래스와 코드를 추가해야 하는 경우 팩토리 메서드 패턴을 사용하면 쉽게 해당 객체를 추가할 수 있으므로 확장성이 높다.

 

3. 코드 중복 제거: 만약 객체 생성 코드가 여러 곳에 중복되어 있다면 팩토리 메서드 패턴을 사용하여 중복을 제거할 수 있다.

 

단점:

 

1. 클래스 수 증가: 팩토리 메서드 패턴을 사용하면 클래스 수가 증가할 수 있다. 이는 객체 생성에 대한 책임을 하위 클래스에게 넘겨주므로, 구현 클래스와 객체를 생성하는 팩토리 메서드의 수가 증가하기 때문이다.

 

2. 암시적 의존성: 팩토리 메서드 패턴은 객체 생성 코드를 추상화하기 때문에, 이를 사용하는 클래스는 구체적인 클래스의 이름이 아닌 추상 클래스나 인터페이스를 참조해야 한다. 이로 인해 클래스간 암시적인 의존성이 생길 수 있다.

 

3. 복잡성: 팩토리 메서드 패턴을 사용하면 클래스 수가 증가하고 코드가 복잡해질 수 있다. 팩토리 메서드 패턴을 사용하면서도 코드를 단순하게 유지할 수 있도록 구현에 대한 충분한 고민이 필요하다.

 

 

 

5. 토론: 팩토리 메서드 패턴 활용 사례 검토하기

 

 

팩토리 메서드 패턴은 객체 생성을 추상화하여 유연성과 확장성을 향상시키는 패턴입니다. 이 패턴은 다양한 환경에서 사용되는데, 여기서는 몇 가지 예를 살펴보겠습니다.

 

1. 게임 개발: 캐릭터 생성

 

게임에서 캐릭터를 생성하는 것은 팩토리 메서드 패턴으로 구현될 수 있습니다. 캐릭터는 여러 종류가 있을 수 있으며, 각 캐릭터마다 다른 기술을 가지고 있을 수 있습니다. 따라서, 팩토리 메서드를 사용하여 각각의 캐릭터를 생성하고, 이들이 각자의 능력을 수행하도록 할 수 있습니다.

 

2. UI 개발: 레이아웃 생성

 

UI 개발에서도 팩토리 메서드 패턴을 사용할 수 있습니다. 예를 들어, 레이아웃을 생성할 때, 팩토리 메서드 패턴을 사용하여 각각의 레이아웃을 생성하고 각각의 레이아웃이 다른 UI 요소들과 함께 작동하도록 할 수 있습니다.

 

3. 웹 개발: 데이터베이스 커넥션 생성

 

웹 개발에서 팩토리 메서드 패턴은 데이터베이스 커넥션을 생성하는 데 사용될 수 있습니다. 데이터베이스 종류에 따라 다른 커넥션을 생성해야 하므로, 팩토리 메서드 패턴을 사용하여 각각의 데이터베이스에 맞는 커넥션을 생성하고 사용할 수 있습니다.

 

4. 소프트웨어 엔지니어링: 테스트 데이터 생성

 

소프트웨어 엔지니어링에서도 팩토리 메서드 패턴이 테스트 데이터를 생성하는 데 사용될 수 있습니다. 각각의 테스트 케이스를 위해 생성된 테스트 데이터는 각자의 서로 다른 특성을 가진 데이터임으로, 팩토리 메서드 패턴을 사용하여 적절하게 데이터를 생성할 수 있습니다.

 

이러한 방식으로 팩토리 메서드 패턴은 다양한 분야에서 활용될 수 있습니다. 각각의 분야에서는 다양한 방법으로 구현할 수 있으며, 최적의 방법을 결정하기 위해 팀 내 토론이 필요할 수 있습니다.

 

 

 

댓글