팩토리 패턴이란 객체 생성을 위해 필요한 인터페이스를 만든 후,
인터페이스를 구현한 팩토리를 통해 어떤 객체를 만들지 결정하는 디자인 패턴이다.
종류 | 공통점 | 차이점 |
팩터리 메서드 패턴 |
객체의 생성부 캡슐화를 통해 낮은 결합도를 만들며 구체적인 타입에 의존하지 않도록 해준다. | 상속을 통해 팩토리 메서드를 오버라이딩하여 생성부를 구현한다. |
추상 팩토리 패턴 | 객체 집합을 생성하기 위한 정의를 추상객체에 위임하고 구현체에서 세부적인 집합 생성 과정을 구현한다. |
팩토리 메서드 패턴
생성할 객체 타입을 예측할 수 없거나 객체 생성의 책임을 서브 클래스에게 위임하고 정보 은닉을 하고자 할때 사용된다.
장점
- 객체지향의 원칙 중 하나인 개방 폐쇄의 원칙에 의거할 수 있다. 즉, 확장에는 열려있고 변경에는 닫혀있다.
- 생성자와 상품간의 낮은 결합도를 가지고 있다.
- 코드가 간결해지며, 병렬형 클래스 계층도를 연결하는 역할을 담당한다.
단점
- 클래스 계층 및 클래스가 많이질 수 있다.
설계 구조
예제 코드
생성자 인터페이스
public interface Constructor {
// 함수형 인터페이스를 이용하였다.
Product createProduct(Supplier<Product> productSupplier);
}
생성자 팩토리
public class ConcreteCreator implements Constructor {
@Override
public Product createProduct(Supplier<Product> productSupplier) {
return productSupplier.get();
}
}
상품 인터페이스
public interface Product {
default void whenProductConstructorCall() {
System.out.println("========================");
}
void info();
void usage();
}
자동차 추상클래스
public abstract class Car implements Product {
public Car() {
whenProductConstructorCall();
}
@Override
public void info() {
System.out.println("자동차 입니다.");
}
@Override
public void usage() {
System.out.println("이동수단 입니다.");
}
}
Bmw 클래스
public class Bmw extends Car {
@Override
public void info() {
super.info();
System.out.println("자동차 중 Bmw입니다.");
}
}
벤츠 클래스
public class Benz extends Car {
@Override
public void info() {
super.info();
System.out.println("자동차 중 벤츠입니다.");
}
}
필기구 추상 클래스
public abstract class Pencil implements Product {
public Pencil() {
whenProductConstructorCall();
}
@Override
public void info() {
System.out.println("필기구입니다.");
}
@Override
public void usage() {
System.out.println("작성할때 사용합니다.");
}
}
색연필 클래스
public class ColorPencil extends Pencil {
@Override
public void info() {
super.info();
System.out.println("필기구 중 색연필입니다.");
}
}
실행결과
public class Main {
public static void main(String[] args) {
Constructor constructor = new ConcreteCreator();
Product bmw = constructor.createProduct(Bmw::new);
bmw.info();
bmw.usage();
Product benz = constructor.createProduct(Benz::new);
benz.info();
benz.usage();
Product colorPencil = constructor.createProduct(ColorPencil::new);
colorPencil.info();
colorPencil.usage();
}
}
'Study with group > Key Words' 카테고리의 다른 글
정적 유틸리티 클래스 (Static Utility Class) (0) | 2023.01.09 |
---|---|
브리지 패턴 (Bridge Pattern) (0) | 2023.01.07 |
플라이 웨이트 패턴 (Flyweight Pattern) (0) | 2023.01.07 |
댓글