Factory Method Pattern - dnwls16071/Backend_Summary GitHub Wiki

πŸ“š Factory Method Pattern μ„€λͺ…

  • ν΄λž˜μŠ€λ“€μ˜ 관리와 생성을 λ‹΄λ‹Ήν•˜λŠ” νŒ©ν† λ¦¬λ₯Ό λ§Œλ“€μ–΄ 쀑간에 두면 ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œμ—μ„œλŠ” ν΄λž˜μŠ€λ“€μ˜ μ„ΈλΆ€ μ’…λ₯˜ 변화에 μ‹ κ²½μ“Έ ν•„μš”κ°€ μ—†μ–΄μ§„λ‹€.

[Ex1]

// Product interface
public interface Product {
    void create();
}
// 각 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ μƒν’ˆ
public class Electronics implements Product {
    @Override
    public void create() {
        System.out.println("Electronics product created.");
    }
}

// 각 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ μƒν’ˆ
public class Clothing implements Product {
    @Override
    public void create() {
        System.out.println("Clothing product created.");
    }
}

// 각 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ μƒν’ˆ
public class Book implements Product {
    @Override
    public void create() {
        System.out.println("Book product created.");
    }
}
// ProductFactory class
public abstract class ProductFactory {

    // Factory Method
    public abstract Product createProduct(String type);

    public Product orderProduct(String type) {
        Product product = createProduct(type);
        product.create();
        return product;
    }
}
// ConcreteProductFactory class (Concrete Factory)
public class ConcreteProductFactory extends ProductFactory {
    @Override
    public Product createProduct(String type) {
        if (type.equalsIgnoreCase("electronics")) {
            return new Electronics();
        } else if (type.equalsIgnoreCase("clothing")) {
            return new Clothing();
        } else if (type.equalsIgnoreCase("book")) {
            return new Book();
        } else {
            throw new IllegalArgumentException(
                "Unknown product type."
            );
        }
    }
}