[디자인패턴] 팩토리 메서드 패턴 (Factory Method Pattern)

koline·2023년 8월 10일
0

디자인패턴

목록 보기
3/24

팩토리 메서드 패턴


어떤 상황에서 조건에 따라 객체를 다르게 생성해야 할 때, 예를 들어 사용자의 입력값에 따라 하는 일이 달라질 경우, 분기를 통해 특정 객체를 생성해야 한다.

팩토리 메서드 패턴은 이렇게 분기에 따른 객체의 생성(new 연산자로 객체를 생성하는 부분)을 직접하지 않고, 팩토리라는 클래스에 위임하여 팩토리 클래스가 객체를 생성하도록 하는 방식을 말한다.

예를 들어 클라이언트가 휴대폰 제작을 의뢰하려고 한다면, 그 과정은 다음과 같다.

  1. 클라이언트에게 휴대폰 제작 의뢰 받음
  2. 전자기기 생산 업체는 의뢰를 받고 휴대폰 공장에게 생산 지시
  3. 휴대폰 공장에서 의뢰받은 제품을 확인 후 생산

위 과정을 코드로 작성하면 다음과 같다.

// Client가 전자기기 생산 업체에게 휴대폰 생산 의뢰
public class Client {
    public static void main(String[] args) {
        ProductCompany productCompany = new ProductCompany();
        productCompany.createPhone("Galaxy");
    }
}

// 전자기기 생산 업체에서 휴대폰 공장으로 생산 지시
public class ProductCompany {
    public Phone createPhone(String type) {
        PhoneFactory phoneFactory = new PhoneFactory();
        Phone phone = phoneFactory.createPhone(type);

        return phone;
    }
}

// 휴대폰 공장에서 제품 확인 후 생산하여 반환
public class PhoneFactory {
    public Phone createPhone(String type) {
        Phone phone = null;
        switch (type) {
            case "IPhone":
                phone = new IPhone();
                break;
            case "Galaxy":
                phone = new Galaxy();
                break;
            case "GalaxyNote":
                phone = new GalaxyNote();
                break;
        }
        return phone;
    }
}

// 휴대폰 객체
public abstract class Phone {
}

// 휴대폰 객체를 확장하는 제품군
public class IPhone extends Phone {
    public IPhone() {
        System.out.println("I am IPhone!");
    }
}

public class Galaxy extends Phone {
    public Galaxy() {
        System.out.println("I am Galaxy!");
    }
}

public class GalaxyNote extends Phone {
    public GalaxyNote() {
        System.out.println("I am GalaxyNote!");
    }
}

위와 같이 객체 생성을 직접 하지 않고 Factory에게 위임하는 방식이 팩토리 메서드 패턴의 특징이다. 이 패턴에서는 한 클래스(휴대폰)를 확장하는 여러 클래스(아이폰, 갤럭시 등)가 있을 때 해당 클래스의 객체를 생성하는 팩토리를 만들어서 객체의 분기 및 생성을 위임하고 객체를 상위 공장에서 반환 받아 클라이언트에게 돌려준다.

이 방식을 사용하는 이유는 현재는 휴대폰을 생산 지시하는 업체가 하나 밖에 없었지만 여러 업체에서 지시한다면 제품을 판별하고 생산해내는 작업을 (switch-case 문으로 작성된 부분) 모든 업체에서 반복해야 한다.

즉, 중복된 코드가 발생하고 여러 클래스에서 객체를 생성하게 되면 객체간의 결합도가 증가해서 유지보수가 어려워진다.



참고


[디자인패턴] 디자인패턴이란? - 생성패턴, 구조패턴, 행위패턴

[디자인패턴] 팩토리 메서드 패턴 ( Factory Method Pattern )

profile
개발공부를해보자

0개의 댓글