팩토리 패턴(Factory Pattern)이란?
팩토리 패턴은 객체를 생성하는 과정을 캡슐화하고, 이를 통해 클라이언트가 생성되는 객체의 타입을 지정하지 않고도 객체를 얻을 수 있게 한다. 또한, 객체의 생성과 관련된 복잡한 로직이나 클래스를 숨기고, 객체 생성을 담당하는 팩토리 클래스를 도입하여 시스템을 더 유연하게 만든다.
팩토리 패턴의 세가지 타입
1. 간단한(또는 정적) 팩토리 메서드 패턴(Simple or Static Factory Method Pattern): 하나의 팩토리 메서드가 객체를 생성하는 패턴이다. 이는 일반적으로 인터페이스나 추상 클래스를 통해 여러 하위 클래스들이 구현될 수 있다.
2. 팩토리 메서드 패턴(Factory Method Pattern): 여러 객체를 생성하는 팩토리를 만들고, 이를 통해 객체를 생성하는 패턴이다. 각각의 팩토리 메서드는 특정 타입의 객체를 생성하며, 클라이언트는 필요에 따라 적절한 팩토리 메서드를 호출하여 객체를 생성한다.
3. 추상 팩토리 패턴(Abstract Factory Pattern): 관련된 객체들의 집합을 생성하는 팩토리를 정의하는 패턴이다. 이는 여러 개의 팩토리 메서드를 가진 추상 클래스나 인터페이스를 사용하여 여러 객체들을 생성한다.
팩토리 패턴의 특징
1. 객체 생성의 캡슐화 (Encapsulation of Object Creation): 팩토리 패턴은 객체 생성을 캡슐화하여 클라이언트가 구체적인 객체를 직접 생성하지 않도록 한다. 이로써 시스템이 더 유연해지고 객체 생성의 세부사항이 숨겨진다.
2. 유연성과 확장성 (Flexibility and Extensibility): 팩토리 패턴을 사용하면 새로운 객체를 쉽게 추가하거나 기존 객체를 변경할 수 있다. 새로운 객체를 추가할 때 기존 코드를 수정하지 않고 팩토리를 확장할 수 있으므로 유지보수가 용이하다.
3. 코드 중복 방지 (Avoidance of Code Duplication): 팩토리 패턴을 사용하면 객체 생성 코드가 여러 곳에 중복되는 것을 방지할 수 있다. 객체 생성 로직이 한 곳에 집중되므로 변경이 필요할 때 중복된 코드를 수정할 필요가 없다.
4. 의존성 주입 (Dependency Injection): 팩토리 패턴은 객체를 생성하는 책임을 팩토리에 위임함으로써 의존성 주입을 쉽게 구현할 수 있다. 클라이언트는 구체적인 객체 타입이 아니라 추상적인 팩토리 인터페이스나 클래스에 의존하게 된다.
5. 인터페이스와 구현 분리 (Separation of Interface and Implementation): 팩토리 패턴은 추상화를 통해 인터페이스와 구현을 분리하므로, 클라이언트는 객체를 사용할 때 객체의 구체적인 타입에 대해 알 필요가 없다.
6. 클라이언트의 단순화 (Client Simplification): 팩토리 패턴을 사용하면 클라이언트 코드가 단순화된다. 클라이언트는 어떤 객체가 생성되는지에 대한 세부사항을 알 필요가 없으며, 단순히 팩토리를 호출하여 객체를 얻을 수 있다.
7. 생성된 객체 유형의 동적 변경 (Dynamic Change of Created Object Type): 팩토리 패턴을 사용하면 런타임에 어떤 객체가 생성될지 동적으로 변경할 수 있다. 팩토리 메서드를 수정하거나 다른 구체적인 팩토리를 제공함으로써 객체의 유형을 변경할 수 있다.
'SOFTWARE DESIGN PATTERN' 카테고리의 다른 글
[SOFTWARE DESIGN PATTERN] 06 커맨드 패턴(Command Pattern) (0) | 2023.11.26 |
---|---|
[SOFTWARE DESIGN PATTERN] 05 싱글턴 패턴(Singleton Pattern) (0) | 2023.11.26 |
[SOFTWARE DESIGN PATTERN] 03 데코레이터 패턴(Decorator Pattern) (0) | 2023.11.26 |
[SOFTWARE DESIGN PATTERN] 02 옵저버 패턴(Observer Pattern) (0) | 2023.11.26 |
[SOFTWARE DESIGN PATTERN] 01 전략 패턴(Strategy Pattern) (0) | 2023.11.26 |