Factory Pattern이란❓
객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴이자, 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴
왜 써야하는데 ❓
결론부터 말하면 객체 생성 하는 코드를 분리하여 클라이언트 코드와 결합도(의존성)를 낮추어 코드를 건드리는 횟수를 최소화 하기 위한 패턴이다.
여기서 클라이언트 코드는 분리시킨 객체 생성 코드를 호출하는 쪽을 의미한다.
결합도(의존성)는 왜 낮춰질까❓
그것은 객체 지향 성질 중에 하나인 다형성을 이용하였기 때문이다. 인터페이스를 구현한 객체들은 같은 인터페이스를 바라 보기 때문에 코드에 유연함이 있기 때문이다.
어떻게 코드를 건드리는 횟수가 최소화 될까❓
객체를 생성하는 코드 부분을 분리 시켰기 때문에 객체를 추가/수정이 일어 나더라도 객체를 생성하는 코드만 건들면 되기 때문이다.
일단, 객체를 생성하는 일은 구상클래스를 만드는 일인데 새로운 객체가 추가 될 수도 있고 삭제될 수 있는 가능성이 상대적으로 많다.
또한 객체를 생성하는 코드가 여러 클래스내 에서도 사용되면 예를 들어 10개의 클래스 내에서 객체를 생성하는 if ~ else if 구문이 있다고 했을때 객체 추가/수정이 발생하면 10개의 클래스에 코드를 변경해 줘야 하는 일이 발생한다.
바로 이런 문제점들을 해결하기 위해 팩토리 패턴을 사용한다 !!!
왜 Factory Pattern이 나오게 됐을까❓
객체 지향 디자인 패턴의 기본 원칙은 확장에 있어서는 열려 있어야 하며, 수정에 있어서는 닫혀 있어야 한다는 것이다. ( = 개방 폐쇄 원칙)
여기서 수정에 닫혀 있어야 한다는 말을 보자
코드를 수정하지 않아도 모듈의 기능을 확장하거나 변경할 수 있어야 한다.
그렇기 때문에 수정이 일어날 가능성이 큰 부분과 그렇지 않은 부분을 분리하는 것이 좋다.
객체는 속성과 함수가 변경 또는 추가될 수 있다. 이에 따라 객체의 생성을 담당하는 코드는 변경의 가능성이 높다.
객체 생성을 담당하는 클래스를 한 곳에서 관리하여 느슨한 결합을 위하여 팩토리 패턴이 나오게 된 것이다.
또한 상위 클래스에서는 인스턴스 생성 방식에 대해 전혀 알 필요가 없기에 더 많은 유연성을 갖게 된다.
그리고 객체 생성 로직이 따로 떼어져 있어서 코드를 리팩터링하더라도 한 곳만 고칠 수 있게 되니 유지 보수성이 증가된다.
🧐 예를 들어 보자
라떼 레시피와 아메리카노 레시피, 우유 레시피라는 구체적인 내용이 들어 있는 하위 클래스가 컨베이어 벨트를 통해 전달되고,
상위 클래스인 바리스타 공장에서 이 레시피들을 토대로 우유 등을 생산하는 생산 공정을 생각하면 된다.
여기서 잠깐❗️
그렇다면 팩토리 패턴과 DI의 차이점은 뭐지?
Factory도 객체를 Inject 하는 방식이라고 볼 수 있어서 둘 다 객체 주입을 한다는 점에서는 동일하다.
그렇지만 객체 생성의 책임이 내부에 있느냐, 외부에 있느냐가 차이점인데, 팩토리 패턴은 내부에서 객체를 생성한다!
반면에 DI는 외부에서 객체를 생성한다!
❓팩토리 패턴은 내부에서 객체를 생성하고 DI는 외부에서 객체를 생성한다고 하는데 팩토리 패턴도 외부에서 객체를 생성하는 거 아니야?
일반적으로 팩토리 패턴은 객체를 생성하는 메커니즘을 캡슐화하는 디자인 패턴입니다. 팩토리 패턴은 클라이언트 코드로부터 객체 생성 로직을 분리하여 객체를 생성하는 책임을 팩토리 클래스에게 위임합니다. 이렇게 함으로써 클라이언트 코드는 생성된 객체의 구체적인 타입을 알 필요가 없습니다.
팩토리 패턴은 크게 두 가지 유형으로 나눌 수 있습니다.
1. 간단한 팩토리 패턴 : 객체 생성을 캡슐화하는 클래스를 제공하고, 이 클래스의 메서드를 호출하여 객체를 생성합니다.
이 패턴은 하나의 팩토리 클래스에 모든 객체 생성 로직이 들어가는 간단한 형태의 패턴입니다.
2. 추상 팩토리 패턴 : 여러 관련된 객체들을 생성하는데 사용되며, 이들 객체들이 같은 '패밀리'에 속하는 경우에 유용합니다.
이 패턴은 관련된 여러 개의 팩토리 클래스를 제공하고, 이러한 팩토리 클래스들이 각자의 패밀리에 속하는 객체를 생성합니다.
이와는 달리, 의존성 주입(Dependency Injection, DI)은 객체가 생성되는 시점에 외부에서 해당 객체의 의존성을 주입하는 디자인 패턴입니다. DI는 객체가 생성되는 주체와 의존성이 주입되는 주체가 분리되어 있습니다.
팩토리 페턴에서도 객체 생성을 외부에서 할 수 있습니다. 예를 들어, 클라이언트 코드가 직접 팩토리 객체를 생성하고 사용할 수 있습니다.
따라서 팩토리 패턴과 DI는 엄격하게 구분되지는 않습니다. 다만, 일반적으로 팩토리 패턴은 객체 생성 메커니즘을 캡슐화하는 것에 중점을 두고, DI는 객체 간의 의존성을 주입하는 것에 중점을 둡니다. 팩토리 패턴과 DI를 조합하여 사용하는 경우도 있습니다.
- chatGPT
참고
https://doojuns-ordinary.tistory.com/123
'CS' 카테고리의 다른 글
운영체제란? (1) | 2025.05.19 |
---|---|
MVC, MVP, MVVM 패턴 (0) | 2024.01.31 |