[Android] Factory Function, Factory Method

chaeny·2024년 12월 21일

Factory Function

  • 일반 함수로 정의된 객체 생성 함수
  • 클래스 외부에서 정의된다. 독립적인 함수로 객체를 생성하거나 반환한다
  • 함수 이름과 반환 타입을 자유롭게 설정할 수 있으며, 필요에 따라 다른 클래스의 객체를 반환할 수 있다.
  • 보통 이름을 통해 어떤 객체를 생성하는지 명확히 전달한다
  • 객체 생성 로직이 간단하고, 독립적으로 작동해야 할 때 사용한다
  • 객체 생성 로직이 특정 클래스에 강하게 의존하지 않을 때 사용한다
  • 구현을 숨기지 않아도 괜찮을 때 사용한다

Factory Method

  • 클래스 내부에 정의된 객체 생성 메서드
  • 보통 특정 클래스를 상속하거나 구현하는 객체를 반환하도록 설계된다.
  • 객체 생성 로직을 서브클래스에 위임하는 디자인 패턴으로 자주 사용된다
  • 객체 생성의 책임을 클래스 또는 서브클래스에 위임한다
  • 서브클래스에서 override하여 동작을 변경할 수 있다
  • 객체 생성 로직이 클래스나 서브클래스와 강하게 연결되어 있을 때 사용한다
  • 서브클래스를 통해 동작을 확장하거나 override해야 할 때 사용한다
  • 객체 생성 로직을 감추거나 추상화해야 할 때 사용한다

즉 Factory Method가 디자인 패턴이다. 객체 생성의 책임을 서브클래스에 위임하고, 다형성을 활용하여 객체 생성을 캡슐화한다.

Factory Provider Pattern

객체 생성의 책임을 클라이언트 코드로부터 분리하여, 객체를 생성하는 방법을 캡슐화하는 디자인 패턴
이 패턴은 주로 객체의 생성 로직이 복잡하거나, 여러 종류의 객체를 생성해야 할 때 유용하다

// Product 인터페이스
interface Product {
    void use();
}

// ConcreteProduct A
class ProductA implements Product {
    @Override
    public void use() {
        System.out.println("Using Product A");
    }
}

// ConcreteProduct B
class ProductB implements Product {
    @Override
    public void use() {
        System.out.println("Using Product B");
    }
}


// Factory 인터페이스
interface ProductFactory {
    Product createProduct();
}

// Factory A
class ProductAFactory implements ProductFactory {
    @Override
    public Product createProduct() {
        return new ProductA();
    }
}

// Factory B
class ProductBFactory implements ProductFactory {
    @Override
    public Product createProduct() {
        return new ProductB();
    }
}


// Provider
class FactoryProvider {
    public static ProductFactory getFactory(String type) {
        if ("A".equalsIgnoreCase(type)) {
            return new ProductAFactory();
        } else if ("B".equalsIgnoreCase(type)) {
            return new ProductBFactory();
        }
        return null;
    }
}


// 클라이언트 코드
public class Client {
    public static void main(String[] args) {
        ProductFactory factory = FactoryProvider.getFactory("A");
        Product product = factory.createProduct();
        product.use();  // "Using Product A" 출력
    }
}

Factory : 객체 생성 로직을 담당하는 클래스입니다. 클라이언트는 직접 객체를 생성하지 않고, Factory를 통해 객체를 요청합니다.
Provider : 다양한 Factory를 제공하여 클라이언트가 필요로 하는 특정 객체를 생성할 수 있도록 합니다. 여러 종류의 Factory를 관리하고, 클라이언트의 요청에 따라 적절한 Factory를 제공합니다.
Product : 제품의 인터페이스를 정의합니다.
Concrete Products : ProductA와 ProductB는 실제 제품을 구현합니다.
ProductFactory : 제품을 생성하는 Factory 인터페이스입니다.
Concrete Factories : ProductAFactory와 ProductBFactory는 각각의 제품을 생성하는 Factory입니다.
FactoryProvider : 요청에 따라 적절한 Factory를 반환하는 Provider입니다.
Client : 클라이언트는 FactoryProvider를 통해 필요한 제품의 Factory를 얻고, 제품을 생성하여 사용합니다.

💡 Factory Provider Pattern의 주요 목적
- 객체 생성 로직을 클라이언트로부터 분리하기 위해
💡 Factory Provider Pattern을 사용할 때의 장점
- 객체 생성의 유연성을 높인다.
💡 Factory Provider Pattern의 주요 이점
- 모든 객체를 단일 타입으로 만든다
💡 Factory Provider Pattern의 단점
- 복잡한 구조
💡 Factory Provider Pattern을 사용하면 코드의 어떤 특성이 향상되는가
- 유연성 및 유지보수성
💡 Factory Provider Pattern을 사용할 때 객체의 생명주기를 어떻게 관리하나
- Factory가 관리
💡 Factory Provider Pattern을 통해 객체를 생성할 때 고려해야 할 점
- 객체의 초기화 방법
💡 Factory Provider Pattern의 구현에서 일반적으로 사용되는 프로그래밍 원칙
- 단일 책임 원칙(SRP)
- 개방-폐쇄 원칙(OCP)
- 의존성 역전 원칙(DIP)

0개의 댓글