-
생성패턴 - 팩토리 메소드(Factory Method) 패턴Java/디자인패턴 2024. 11. 12. 10:06반응형
팩토리 메소드(Factory Method) 패턴은 **생성 패턴(Creational Pattern)**에 속하는 디자인 패턴입니다. 이 패턴은 객체의 생성 방식을 서브클래스에서 결정하도록 하여 객체 생성 시 객체의 구체적인 클래스를 지정하지 않고도 객체를 생성할 수 있게 해줍니다. 즉, 객체 생성을 캡슐화하여 생성 로직을 서브클래스에서 정의할 수 있도록 합니다.
팩토리 메소드 패턴의 목적
- 특정 클래스의 인스턴스를 생성하는 책임을 서브클래스에게 위임하여, 상위 클래스에서 객체를 생성하는 방법과 관련된 결정을 서브클래스에서 정의하도록 합니다.
- 객체를 생성할 때 클라이언트 코드가 구체적인 클래스에 의존하지 않도록 하여, 코드의 유연성과 확장성을 높입니다.
팩토리 메소드 패턴의 구조
- Product (제품 인터페이스): 팩토리 메소드가 생성할 객체의 인터페이스 또는 추상 클래스.
- ConcreteProduct (구체적인 제품): Product 인터페이스를 구현한 클래스들입니다. 팩토리 메소드를 통해 생성됩니다.
- Creator (생성자): 팩토리 메소드를 선언하는 클래스입니다. 기본 팩토리 메소드를 정의할 수도 있고, 이를 서브클래스에서 오버라이드할 수 있도록 할 수도 있습니다.
- ConcreteCreator (구체적인 생성자): Creator 클래스를 상속하여 실제 객체 생성 로직을 구현합니다.
팩토리 메소드 패턴 예제 코드 (Java)
이 예제에서는 Product라는 인터페이스와 ConcreteProductA와 ConcreteProductB라는 두 가지 제품을 정의하고, ProductFactory라는 팩토리 클래스를 통해 제품을 생성하는 방식을 보여줍니다.
// Product 인터페이스 interface Product { void use(); } // ConcreteProductA 클래스 class ConcreteProductA implements Product { @Override public void use() { System.out.println("Using Product A"); } } // ConcreteProductB 클래스 class ConcreteProductB implements Product { @Override public void use() { System.out.println("Using Product B"); } } // Creator 클래스 (추상 클래스 또는 인터페이스) abstract class ProductFactory { // 팩토리 메소드 abstract Product createProduct(); // 제품을 사용하는 메소드 public void useProduct() { Product product = createProduct(); // 제품 생성 product.use(); // 제품 사용 } } // ConcreteCreatorA 클래스 class ProductFactoryA extends ProductFactory { @Override Product createProduct() { return new ConcreteProductA(); } } // ConcreteCreatorB 클래스 class ProductFactoryB extends ProductFactory { @Override Product createProduct() { return new ConcreteProductB(); } } // 사용 예시 public class Main { public static void main(String[] args) { ProductFactory factoryA = new ProductFactoryA(); ProductFactory factoryB = new ProductFactoryB(); factoryA.useProduct(); // "Using Product A" 출력 factoryB.useProduct(); // "Using Product B" 출력 } }
코드 설명
- Product 인터페이스는 생성될 객체의 공통된 인터페이스 역할을 합니다.
- ConcreteProductA와 ConcreteProductB는 Product 인터페이스를 구현한 실제 클래스들로, 각각 구체적인 기능을 제공합니다.
- ProductFactory는 팩토리 메소드를 정의하는 추상 클래스입니다. 팩토리 메소드(createProduct())는 구체적인 제품 생성을 위한 추상 메소드로, 서브클래스에서 오버라이드됩니다.
- ProductFactoryA와 ProductFactoryB는 각각 ConcreteProductA와 ConcreteProductB를 생성하는 구체적인 팩토리 클래스들입니다.
- Main 클래스에서, 각 팩토리 클래스를 통해 필요한 제품을 생성하고 사용하는 것을 보여줍니다.
팩토리 메소드 패턴의 장점
- 클래스 간 결합도를 낮춤: 클라이언트가 구체적인 클래스에 의존하지 않고 인터페이스만을 사용하게 되어 결합도가 낮아집니다.
- 확장 용이성: 새로운 제품 클래스가 필요하면 새로운 팩토리 클래스를 추가해 구현할 수 있습니다.
- 유연성 증가: 객체 생성과 관련된 코드를 별도의 클래스에서 관리하므로 클라이언트는 생성 방식에 신경 쓸 필요가 없습니다.
팩토리 메소드 패턴의 단점
- 클래스 수 증가: 팩토리 메소드 패턴을 사용할 경우 팩토리 클래스와 제품 클래스가 별도로 필요하기 때문에 클래스 수가 많아질 수 있습니다.
- 복잡성 증가: 작은 규모의 프로그램에서는 오히려 코드가 복잡해질 수 있습니다.
팩토리 메소드 패턴은 주로 객체 생성 로직을 캡슐화하여 결합도를 낮추고 유연성을 높이는 데 사용됩니다.
반응형'Java > 디자인패턴' 카테고리의 다른 글
행동(Behavioral) - 관찰자(Observer) 패턴 (0) 2024.11.14 구조패턴 - 프록시(Proxy) 패턴 (0) 2024.11.13 구조 패턴- 브릿지(Bridge) 패턴 (0) 2024.11.11 구조 패턴 - 어댑터(Adapter) 패턴 (0) 2024.11.10 행위 패턴 - 상태 패턴 (State Pattern) (0) 2024.11.09