본문 바로가기
Study with group/Key Words

팩터리 패턴 (Factory Pattern)

by JunHeeLim 2023. 1. 9.

팩토리 패턴이란 객체 생성을 위해 필요한 인터페이스를 만든 후,

인터페이스를 구현한 팩토리를 통해 어떤 객체를 만들지 결정하는 디자인 패턴이다.

 

종류 공통점 차이점
팩터리 메서드 패턴
객체의 생성부 캡슐화를 통해 낮은 결합도를 만들며 구체적인 타입에 의존하지 않도록 해준다. 상속을 통해 팩토리 메서드를 오버라이딩하여 생성부를 구현한다.
추상 팩토리 패턴 객체 집합을 생성하기 위한 정의를 추상객체에 위임하고 구현체에서 세부적인 집합 생성 과정을 구현한다.

 

팩토리 메서드 패턴

생성할 객체 타입을 예측할 수 없거나 객체 생성의 책임을 서브 클래스에게 위임하고 정보 은닉을 하고자 할때 사용된다.

 

장점

객체지향의 원칙 중 하나인 개방 폐쇄의 원칙에 의거할 수 있다. 즉, 확장에는 열려있고 변경에는 닫혀있다.

- 생성자와 상품간의 낮은 결합도를 가지고 있다.

- 코드가 간결해지며, 병렬형 클래스 계층도를 연결하는 역할을 담당한다.

 

단점

- 클래스 계층 및 클래스가 많이질 수 있다.

 

설계 구조

예제 설계 구조

 

예제 코드

생성자 인터페이스

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();
    }
}

댓글