Search

Factory 패턴

패턴
생성

정의

객체의 생성 로직을 캡슐화하여 추상화하는 생성 디자인 패턴
코드에서 구체적인 객체 생성 방식을 직접 다루는 대신, 공장(Factory) 역할을 하는 객체를 통해 필요한 객체를 생성하도록 설계한다.
객체를 생성하는 코드와 사용하는 코드를 분리하여, 객체의 생성을 한 곳에서 관리하고, 코드의 유연성과 재사용성을 높이는 데 도움이 된다.

종류

Simple Factory : 단일 Concrete Factory를 사용하는 간단한 Factory 패턴
Factory Method : 추상 Factory 메서드를 통해 Concrete Factory를 선택하는 Factory 패턴
Abstract Factory : 제품군을 생성하기 위한 추상 Factory 인터페이스를 제공하는 패턴

주요 구성 요소

Factory 인터페이스 : 객체 생성을 위한 추상 메서드를 정의
Concrete Factory가 구현해야 하는 메서드를 선언
Client는 Factory 인터페이스를 통해 Factory 객체를 사용
Concrete Factory : Factory 인터페이스를 구현하며, 실제 객체 생성 과정을 수행
각 Concrete Factory는 특정 유형의 객체를 생성
Client는 Concrete Factory 객체를 직접 사용하지 않는다.
Product 인터페이스 : 생성된 객체가 구현해야 하는 공통 인터페이스를 정의
Concrete Product가 구현해야 하는 메서드를 선언
Client는 Product 인터페이스를 통해 생성된 객체를 사용
Concrete Product : Product 인터페이스를 구현
Concrete Factory에서 생성된 실제 객체
각 Concrete Product는 특정 유형의 기능을 제공
Client : Factory 객체를 사용하여 필요한 객체를 생성
Factory 인터페이스를 통해 Factory 객체와 상호 작용한다.
Concrete Factory 객체를 직접 사용하지 않는다.
생성된 객체를 사용하여 작업을 수행

작동방식

1.
Client는 Factory 객체를 생성
2.
Client는 Factory 객체의 메서드를 호출하여 필요한 객체를 생성하도록 요청
3.
Factory 객체는 Concrete Factory 객체를 선택하여 실제 객체 생성 과정을 수행
4.
Concrete Factory 객체는 요청에 맞는 객체를 생성하여 Factory 객체에 반환
5.
Factory 객체는 생성된 객체를 Client에게 반환

장점

코드 간결화 : 객체 생성 과정을 캡슐화하여 코드를 간결하게 만들 수 있다.
유연성 향상 : 새로운 객체 생성 방식을 추가하거나 변경하기 쉽다.
결합도 감소 : Client는 구체적인 객체 생성 방식에 의존하지 않는다.
확장성 향상 : 새로운 Concrete Factoy 객체를 추가하여 새로운 객체를 쉽게 생성할 수 있다.
테스트 용이성 : 객체 생성 과정을 모킹(Mocking)하여 테스트하기 쉽다.

단점

추가적인 객체 생성 : Factory 객체와 Concrete Factory 객체가 추가적으로 생성되어 오버헤드가 발생할 수 있다.
추상화 수준 증가 : 코드의 추상화 수준이 증가하여 이해하기 어려워질 수 있다.

사용 예시

GUI 프레임워크 : 위젯 생성을 위한 Factory 패턴을 제공
문서 처리 시스템 : 다양한 문서 형식을 생성하기 위한 Factory 패턴을 제공
데이터베이스 연결 : 다양한 데이터베이스에 연결하기 위한 Factory 패턴을 제공

사용법

1. Factory 인터페이스 정의

객체 생성을 위한 추상 메서드를 정의
Concrete Factory가 구현해야 하는 메서드를 선언
Client는 Factory 인터페이스를 통해 Factory 객체를 사용
public interface Factory { // 객체 생성을 위한 추상 메서드를 정의 Product createProduct(); }
Java
복사

2. Concrete Factory 구현

Factory 인터페이스를 구현
실제 객체 생성 과정을 수행
각 Concrete Factory는 특정 유형의 객체를 생성
Client는 Concrete Factory 객체를 직접 사용하지 않는다.
public class ConcreteFactory1 implements Factory { @Override public Product createProduct() { return new Product1(); } } public class ConcreteFactory2 implements Factory { @Override public Product createProduct() { return new Product2(); } }
Java
복사

3. Product 인터페이스 정의

생성된 객체가 구현해야 하는 공통 인터페이스를 정의
Concrete Product가 구현해야 하는 메서드를 선언
Client는 Product 인터페이스를 통해 생성된 객체를 사용
public interface Product { void doSomething(); }
Java
복사

4. Concrete Product 구현

Product 인터페이스를 구현
Concrete Factory에서 생성된 실제 객체
각 Concretr Product는 특정 유형의 기능을 제공
public class Product1 implements Product { @Override public void doSomething() { System.out.println("Product1 doSomething"); } } public class Product2 implements Product { @Override public void doSomething() { System.out.println("Product2 doSomething"); } }
Java
복사

5. Client 코드 작성

Factory 객체를 생성
Factory 객체의 메서드를 호출하여 필요한 객체를 생성하도록 요청
생성된 객체를 사용하여 작업을 수행
public class Client { public static void main(String[] args) { Factory factory1 = new ConcreteFactory1(); Product product1 = factory1.createProduct(); product1.doSomething(); Factory factory2 = new ConcreteFactory2(); Product product2 = factory2.createProduct(); product2.doSomething(); } }
Java
복사