상세 컨텐츠

본문 제목

[Design Pattern] Factory Method Pattern

JAVA

by jeonghojin 2023. 3. 19. 22:35

본문

Factory Method Pattern

생성 패턴 중 하나로 객체를 생성할 때 어떤 클래스의 인스턴스를 만들지 서브 클래스에서 결정하게 한다.
즉, 인스턴스 생성을 서브 클래스에게 위임한다.
부모 추상 클래스는 인터페이스에만 의존하고 실제로 어떤 구현 클래스를 호출할지는 서브 클래스에서 구현한다.
이렇게 하면 새로운 구현 클래스가 추가되어도 기존 Factory 코드의 수정 없이 새로운 Factory를 추가하면 된다.
 
* 객체 생성 처리를 서브 클래스로 분리해 처리하도록 하는 패턴

- 생성 객체 타입을 예측할 수 없을 때 사용
- 생성할 객체를 기술하는 책임을 서브클래스에게 정의하고자 할 때
- 객체 생성의 책임을 서브클래스에 위임시키고 서브클래스에 대한 정보를 은닉하고자 할 
Product
- 팩토리 메서드로 생성될 객체의 공통 인터페이스
ConcreteProduct *product1
- 구체적으로 객체가 생성되는 클래스
Creator
- 팩토리 메서드를 갖는 클래스
ConcreteCreator
- 팩토리 메서드를 구현하는 클래스로 ConcreteProduct 객체를 생성

 

생성 패턴 : 
- 객체 생성에 관련된 패턴
- 객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공한다.

Interface Vehicle

public interface Vehicle {
    void create();
}

 
- Interface method 를 override하여 각각 class 마다 로직 추가
 
Class Ship

public class Ship implements Vehicle {
    @Override
    public void create() {
        System.out.println("배 생산");
    }
}

 
Class Car

public class Car implements Vehicle {
    @Override
    public void create() {
        System.out.println("자동차 생산");
    }
}

 
Abstract AbstractVehicleFactory

public abstract class AbstractVehicleFactory {

    public Vehicle newInstance() {
        Vehicle vehicle = createVehicle();
        vehicle.create();
        return vehicle;
    }

    protected abstract Vehicle createVehicle();
}

 
 
- 외부에서 객체를 생성할 때는 newInstance() 메서드를 호출
- 실제 어떤 객체를 생성할지에 대해서는 추상클래스를 상속받아 override 하여 서브클래스에서 정의
- java8 부터는 인터페이스에서 default 메서드를 사용할 수 있기 떄문에 인터페이스로 정의할 수 있음.


 
 
 
Class ShipFactory

public class ShipFactory extends AbstractVehicleFactory{
    @Override
    protected Vehicle createVehicle() {
        return new Ship();
    }
}

 
Class CarFactory

public class CarFactory extends AbstractVehicleFactory{
    @Override
    protected Vehicle createVehicle() {
        return new Car();
    }
}

 
Main

public class Main {
    public static void main(String[] args) {
        AbstractVehicleFactory factory = new CarFactory();
        Vehicle vehicle1 = factory.newInstance();

        AbstractVehicleFactory shipFactory = new ShipFactory();
        Vehicle ship = shipFactory.newInstance();
    }
}

 
- 기존 코드 변경없이 새로 선언한 클래스만 사용하여 확장 가능
 

 


Factory Method Pattern 장/단점

장점 :
Factory Method Pattern 의 가장 큰 장점은 수정에 닫혀있고 확장에는 열려있는 OCP 원칙을 지킬 수 있다는 점이다.
*개방/폐쇄 원칙 : 기존 코드의 수정없이 확장 가능
 
단점 :
패턴을 구현하기 위해 많은 자식 클래스들을 도입해야하므로 코드가 복잡해질 수 있다.
 
 


참고 :

더보기

 
 

'JAVA' 카테고리의 다른 글

[Design Pattern] Abstract Factory Pattern  (0) 2023.03.22
[Design Pattern] Command Pattern  (0) 2023.03.21
[Design Pattern] Observer Pattern  (0) 2023.03.18
[Design Pattern] Template Method Pattern  (0) 2023.03.17
[java] ThreadPool  (1) 2023.02.23

관련글 더보기