[ 목차 ]
안녕하세요. 이번에는 팩토리(Factory) 패턴에 대해서 알아보도록 하겠습니다.
1. 팩토리(Factory) 패턴 이란?
팩토리 패턴은 객체 생성을 처리하는 데 사용되는 디자인 패턴입니다. 이 패턴은 객체를 생성하기 위한 공통 인터페이스를 제공하며, 서브 클래스가 어떤 클래스의 인스턴스를 생성할지 결정할 수 있도록 합니다. 팩토리 메서드 패턴과 추상 팩토리 패턴이 주로 사용되는 팩토리 패턴의 두 가지 형태입니다.
2. 팩토리(Factory) 패턴 구현 방법
2.1. 팩토리 메서드 패턴
간단한 팩토리 패턴으로, 서브 클래스가 객체 생성에 관련된 코드를 재정의할 수 있는 패턴입니다.
interface Product {
void createProduct();
}
class ConcreteProduct1 implements Product {
@Override
public void createProduct() {
System.out.println("ConcreteProduct1 created.");
}
}
class ConcreteProduct2 implements Product {
@Override
public void createProduct() {
System.out.println("ConcreteProduct2 created.");
}
}
abstract class ProductFactory {
public abstract Product createProduct();
}
class ConcreteFactory1 extends ProductFactory {
@Override
public Product createProduct() {
return new ConcreteProduct1();
}
}
class ConcreteFactory2 extends ProductFactory {
@Override
public Product createProduct() {
return new ConcreteProduct2();
}
}
2.2. 추상 팩토리 패턴
상호 관련성이 있는 여러 객체를 생성할 수 있는 인터페이스를 제공하는 패턴입니다.
// Animals
interface Animal {
void makeSound();
}
class Dog implements Animal {
@Override
public void makeSound() {
System.out.println("Dog: Woof!");
}
}
class Cat implements Animal {
@Override
public void makeSound() {
System.out.println("Cat: Meow!");
}
}
// Animal Sounds
interface AnimalSound {
void playSound();
}
class DogSound implements AnimalSound {
@Override
public void playSound() {
System.out.println("Playing dog sound...");
}
}
class CatSound implements AnimalSound {
@Override
public void playSound() {
System.out.println("Playing cat sound...");
}
}
// Animal & AnimalSound Factory Interfaces
interface AnimalFactory {
Animal createAnimal();
AnimalSound createAnimalSound();
}
// Concrete Factories
class DogFactory implements AnimalFactory {
@Override
public Animal createAnimal() {
return new Dog();
}
@Override
public AnimalSound createAnimalSound() {
return new DogSound();
}
}
class CatFactory implements AnimalFactory {
@Override
public Animal createAnimal() {
return new Cat();
}
@Override
public AnimalSound createAnimalSound() {
return new CatSound();
}
}
// Client
public class Main {
public static void main(String[] args) {
AnimalFactory dogFactory = new DogFactory();
Animal dog = dogFactory.createAnimal();
AnimalSound dogSound = dogFactory.createAnimalSound();
dog.makeSound();
dogSound.playSound();
AnimalFactory catFactory = new CatFactory();
Animal cat = catFactory.createAnimal();
AnimalSound catSound = catFactory.createAnimalSound();
cat.makeSound();
catSound.playSound();
}
}
3. 팩토리(Factory) 패턴의 장단점
3.1. 장점
- 객체 생성과 사용을 분리하여 결합도를 낮춥니다.
- 새로운 클래스 추가 시 클라이언트 코드 수정이 필요 없어 확장성이 높습니다.
- 객체 생성 과정 중복 줄여 코드 재사용성을 향상시킵니다.
3.2. 단점
- 코드의 복잡성이 증가할 수 있습니다.
- 인터페이스를 강제해야 하므로 약간의 성능 저하가 발생할 수 있습니다.
4. 팩토리(Factory) 패턴의 사용 예
- 데이터베이스 연결 관리: 다양한 데이터베이스 연결 방식에 따라 적절한 연결 객체를 생성해 주는 팩토리 클래스를 사용할 수 있습니다.
- UI 툴킷: 다양한 UI 요소를 동적으로 생성할 때 팩토리 패턴을 사용하여 다양한 UI 요소 클래스를 생성할 수 있습니다.
- 이미지 리더: 다양한 이미지 형식에 대해서 적절한 이미지 리더 객체를 생성하는 팩토리 클래스를 사용할 수 있습니다.
2023.07.12 - [JAVA] - 디자인패턴 - 팩토리(Factory) 패턴
2023.07.12 - [JAVA] - 디자인패턴 - 팩토리(Factory) 패턴
2023.07.12 - [JAVA] - 디자인패턴 - 어댑터(Adapter) 패턴
2023.07.12 - [JAVA] - Java 디자인패턴 - 옵저버(Observer) 패턴
2023.07.12 - [JAVA] - JAVA 디자인패턴 - 싱글톤(Singleton) 패턴
'JAVA' 카테고리의 다른 글
JAVA 디자인패턴 - 이터레이터(Iterator) 패턴의 정의, 사용 이유, 구현방법 (0) | 2023.07.12 |
---|---|
JAVA 디자인패턴 - 어댑터(Adapter) 패턴 (0) | 2023.07.12 |
JAVA 디자인패턴 - 싱글톤(Singleton) 패턴 (0) | 2023.07.12 |
자바 레코드(JAVA RECORD) 개념, 특징, 사용법, 장점, 단점, 활용 사례 (0) | 2023.07.11 |
JAVA8 | 인터페이스 디폴트 메서드, Optional 클래스 (0) | 2023.06.16 |
댓글