Design Pattern | Factory Method (팩토리 메소드)

Factory Method 패턴이란?

  • Factory라는 영어 단어는 공장 이라는 의미가 된다. 공장에서는 물건을 스펙에 맞게 생산하고 요구사항이 좀 달라지면 그에 맞게 조금 다른 물건도 생산을 하게 된다.
  • 원하는 스펙을 입력하면 그에 맞는 instance를 생성해주는 것이 팩토리 메서드 패턴이다.
  • Factory Method 패턴은 인스턴스의 만드는 방법을 슈퍼 클래스로 정해, 구체적인 생성 처리는 서브 클래스측에서 실시하는 방식이다.
  • 인스턴스를 생성하는 공장을 Tmplate Method 패턴으로 구성한 것이 Factory Method 패턴이 된다.
  • GoF 디자인 패턴에서는 생성과 관련된 디자인 패턴으로 분류된다.

Factory Method 패턴 예제 프로그램

ID 카드 공장에서 ID 카드를 만드는 프로그램이다.

Class Diagram
Factory Method Pattern Class Diagram

1. Product 클래스

Factory에서 생성되는 객체의 기본이 되는 클래스이다.

Product.java

package com.devkuma.designpattern.creational.factorymethod.framwork;

public abstract class Product {
    public abstract void use();
}

2. Factory 클래스

Factory의 기본이 되는 클래스이다. 인스턴스를 생성한다.

Factory.java

package com.devkuma.designpattern.creational.factorymethod.framwork;

public abstract class Factory {

    public final Product create(String owner) {
        Product product = createProduct(owner);
        registerProduct(product);
        return product;
    }

    protected abstract Product createProduct(String owner);
    protected abstract void registerProduct(Product product);
}

3. IDCard 클래스

Product 클래스로 정의된 메소드를 구현하는 구상 클래스입니다.

IDCard.java

package com.devkuma.designpattern.creational.factorymethod.idcard;

import com.devkuma.designpattern.creational.factorymethod.framwork.Product;

public class IdCard extends Product {

    private String owner;

    IdCard(String owner) {
        System.out.println(owner + "의 카드를 만듭니다.");
        this.owner = owner;
    }

    public void use() {
        System.out.println(owner + "의 카드를 사용합니다.");
    }

    public String getOwner() {
        return owner;
    }
}

4. IDCardFactory 클래스

Factory 클래스로 정의된 메소드를 구현하는 구상 클래스이다.

IDCardFactory.java

package com.devkuma.designpattern.creational.factorymethod.idcard;

import com.devkuma.designpattern.creational.factorymethod.framwork.Factory;
import com.devkuma.designpattern.creational.factorymethod.framwork.Product;

import java.util.ArrayList;

public class IdCardFactory extends Factory {

    private ArrayList<String> owners = new ArrayList();

    protected Product createProduct(String owner) {
        return new IdCard(owner);
    }

    protected void registerProduct(Product product) {
        IdCard icCard = (IdCard) product;
        String owner = icCard.getOwner();
        owners.add(owner);
    }

    public ArrayList<String> getOwners() {
        return owners;
    }
}

5. Main 클래스

메인 처리를 실행하는 클래스이다.

Main.java

package com.devkuma.designpattern.creational.factorymethod;

import com.devkuma.designpattern.creational.factorymethod.framwork.Factory;
import com.devkuma.designpattern.creational.factorymethod.framwork.Product;
import com.devkuma.designpattern.creational.factorymethod.idcard.IdCardFactory;

public class Main {
    public static void main(String[] args) {
        Factory factory = new IdCardFactory();
        Product card1 = factory.create("devkuma");
        Product card2 = factory.create("kimkc");
        Product card3 = factory.create("yunho");
        card1.use();
        card2.use();
        card3.use();
    }
}

6. 실행 결과

devkuma의 카드를 만듭니다.
kimkc의 카드를 만듭니다.
yunho의 카드를 만듭니다.
devkuma의 카드를 사용합니다.
kimkc의 카드를 사용합니다.
yunho의 카드를 사용합니다.

Factory Method 패턴의 장점

Factory/Product는 framework 패키지, IDCardFactory/IDCard는 idcard 패키지에 존재한다.
framework 패키지는 idcard 패키지를 가져오지 않는다. 즉, framework 패키지는 idcard 패키지에 의존하지 않는 형태이다.
완전히 다른 ‘제품’과 ‘공장’을 만들려는 경우 프레임워크 패키지의 내용을 수정할 필요가 없다.