Home > Backend > CS > ๐Ÿ’พ [CS] ํŒฉํ† ๋ฆฌ ํŒจํ„ด(factory pattern)

๐Ÿ’พ [CS] ํŒฉํ† ๋ฆฌ ํŒจํ„ด(factory pattern)
CS

๐Ÿ’พ [CS] ํŒฉํ† ๋ฆฌ ํŒจํ„ด(factory pattern).

1๏ธโƒฃ ํŒฉํ† ๋ฆฌ ํŒจํ„ด(factory pattern).

  • ํŒฉํ† ๋ฆฌ ํŒจํ„ด(factory pattern)์€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ์—์„œ ๊ฐ์ฒด ์ƒ์„ฑ ๋ถ€๋ถ„์„ ๋–ผ์–ด๋‚ด ์ถ”์ƒํ™”ํ•œ ํŒจํ„ด์ด์ž ์ƒ์† ๊ด€๊ณ„์— ์žˆ๋Š” ๋‘ ํด๋ž˜์Šค์—์„œ ์ƒ์œ„ ํด๋ž˜์Šค๊ฐ€ ์ค‘์š”ํ•œ ๋ผˆ๋Œ€๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ , ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๊ฐ์ฒด ์ƒ์„ฑ์— ๊ด€ํ•œ ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์„ ๊ฒฐ์ •ํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

  • ์ƒ์œ„ ํด๋ž˜์Šค์™€ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ๋ถ„๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋Š์Šจํ•œ ๊ฒฐํ•ฉ์„ ๊ฐ€์ง€๋ฉฐ ์ƒ์œ„ ํด๋ž˜์Šค์—์„œ๋Š” ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์ „ํ˜€ ์•Œ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋งŽ์€ ์œ ์—ฐ์„ฑ์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

    • ๊ทธ๋ฆฌ๊ณ  ๊ฐ์ฒด ์ƒ์„ฑ ๋กœ์ง์ด ๋”ฐ๋กœ ๋–ผ์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ„ฐ๋งํ•˜๋”๋ผ๋„ ํ•œ ๊ณณ๋งŒ ๊ณ ์น  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋‹ˆ ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์ด ์ฆ๊ฐ€๋ฉ๋‹ˆ๋‹ค.
      • ์˜ˆ๋ฅผ ๋“ค์–ด ๋ผ๋–ผ ๋ ˆ์‹œํ”ผ์™€ ์•„๋ฉ”๋ฆฌ์นด๋…ธ ๋ ˆ์‹œํ”ผ, ์šฐ์œ  ๋ ˆ์‹œํ”ผ๋ผ๋Š” ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์ด ๋“ค์–ด ์žˆ๋Š” ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋˜๊ณ , ์ƒ์œ„ ํด๋ž˜์Šค์ธ ๋ฐ”๋ฆฌ์Šคํƒ€ ๊ณต์žฅ์—์„œ ์ด ๋ ˆ์‹œํ”ผ๋“ค์„ ํ† ๋Œ€๋กœ ์šฐ์œ  ๋“ฑ์„ ์ƒ์‚ฐํ•˜๋Š” ์ƒ์‚ฐ ๊ณต์ •์„ ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ์ž๋ฐ”์˜ ํŒฉํ† ๋ฆฌ ํŒจํ„ด

enum CoffeeType {
    LATTE,
    ESPRESSO
}

abstract class Coffee {
    protected String name;
    
    public String getName() {
        return name;
    }
}

class Latte extends Coffee {
    public Latte() {
        name = "latte";
    }
}

class Espresso extends Coffee {
    public Espresso() {
        name = "Espresso";
    }
}

class CoffeeFactory {
    public static Coffee createCoffee(CoffeeType type) {
        switch (type) {
            case LATTE:
                return new Latte();
            case ESPRESSO:
                return new Espresso();
            default:
                throw new IllegalArgumentException("Invalid coffee type: " + type);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Coffee coffee = CoffeeFactory.createCoffee(CoffeeType.LATTE);
        System.out.println(coffee.getName()); // latte
    }
}

3๏ธโƒฃ ์ฝ”๋“œ ์„ค๋ช….

  • ํŒฉํ† ๋ฆฌ ํŒจํ„ด(Factory Pattern) ์€ ๊ฐ์ฒด ์ƒ์„ฑ์˜ ๋กœ์ง์„ ๋ณ„๋„์˜ ํด๋ž˜์Šค๋‚˜ ๋ฉ”์„œ๋“œ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.
    • ์ด๋Š” ๊ฐ์ฒด ์ƒ์„ฑ์— ๊ด€๋ จ๋œ ์ฝ”๋“œ๋ฅผ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ ๋ถ„๋ฆฌํ•˜์—ฌ, ๊ฐ์ฒด ์ƒ์„ฑ์˜ ๋ณ€ํ™”์— ๋Œ€ํ•œ ์œ ์—ฐ์„ฑ์„ ๋†’์ด๊ณ  ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • ํŒฉํ† ๋ฆฌ ํŒจํ„ด ์€ ํฌ๊ฒŒ ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด ๊ณผ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด ์œผ๋กœ ๊ตฌ๋ถ„๋˜๋ฉฐ, ์œ„ ์ฝ”๋“œ ์˜ˆ์‹œ๋Š” ํŒฉํ† ๋ฆฌ ๋ฉ”์Šค๋“œ ํŒจํ„ด ์˜ ์ „ํ˜•์ ์ธ ์˜ˆ์ž…๋‹ˆ๋‹ค.

1. CoffeeType ์—ด๊ฑฐํ˜•(Enum)

enum CoffeeType {
    LATTE,
    ESPRESSO
}
  • ์„ค๋ช… : CoffeeType ์€ ์ปคํ”ผ์˜ ์ข…๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์—ด๊ฑฐํ˜•(Enum)์ž…๋‹ˆ๋‹ค.
    • ์ด ์—ด๊ฑฐํ˜•์€ LATTE ์™€ ESPRESSO ๋‘ ๊ฐ€์ง€ ํƒ€์ž…์˜ ์ปคํ”ผ๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—ญํ•  : ์ปคํ”ผ์˜ ์ข…๋ฅ˜๋ฅผ ์ฝ”๋“œ ๋‚ด์—์„œ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•˜๊ณ , CoffeeFactory ์—์„œ ์ปคํ”ผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

2. Coffee ์ถ”์ƒ ํด๋ž˜์Šค.

abstract class Coffee {
    protected String name;
    
    public String getName() {
        return name;
    }
}
  • ์„ค๋ช… : Coffee ๋Š” ์ปคํ”ผ ๊ฐ์ฒด์˜ ๊ณตํ†ต๋œ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•œ ์ถ”์ƒ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
    • name ํ•„๋“œ๋Š” ์ปคํ”ผ์˜ ์ด๋ฆ„์„ ์ €์žฅํ•˜๋ฉฐ, getName() ๋ฉ”์„œ๋“œ๋Š” ์ปคํ”ผ์˜ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์—ญํ•  : ๊ตฌ์ฒด์ ์ธ ์ปคํ”ผ ํด๋ž˜์Šค๋“ค์ด ์ƒ์†๋ฐ›์•„์•ผ ํ•˜๋Š” ๊ณตํ†ต์ ์ธ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

3. Latte ์™€ Espresso ํด๋ž˜์Šค.

class Latte extends Coffee {
    public Latte() {
        name = "latte";
    }
}

class Espresso extends Coffee {
    public Espresso() {
        name = "Espresso";
    }
}
  • ์„ค๋ช… : Latte ์™€ Espresso ๋Š” Coffee ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ตฌ์ฒด์ ์ธ ์ปคํ”ผ ํƒ€์ž…์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋“ค์ž…๋‹ˆ๋‹ค.
    • ๊ฐ ํด๋ž˜์Šค๋Š” ์ƒ์„ฑ์ž์—์„œ name ํ•„๋“œ๋ฅผ ํŠน์ • ์ปคํ”ผ ์ด๋ฆ„์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์—ญํ•  : ํŠน์ • ์ปคํ”ผ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

4. CoffeeFactory ํด๋ž˜์Šค.

class CoffeeFactory {
    public static Coffee createCoffee(CoffeeType type) {
        switch (type) {
            case LATTE:
                return new Latte();
            case ESPRESSO:
                return new Espresso();
            default:
                throw new IllegalArgumentException("Invalid coffee tyep: " + type);
        }
    }
}
  • ์„ค๋ช… : CoffeeFactory ํด๋ž˜์Šค๋Š” ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ํ•ต์‹ฌ์œผ๋กœ, createCoffee() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํŠน์ • ํƒ€์ž…์˜ ์ปคํ”ผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    • CoffeeType ์—ด๊ฑฐํ˜•์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์ปคํ”ผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์—ญํ•  : ๊ฐ์ฒด ์ƒ์„ฑ์˜ ๋กœ์ง์„ ์ค‘์•™ ์ง‘์ค‘ํ™”ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ ๊ฐ์ฒด ์ƒ์„ฑ์˜ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ๋Š” CoffeeFactory ์˜ createCoffee() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์›ํ•˜๋Š” ์ปคํ”ผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. Main ํด๋ž˜์Šค.

public class Main {
    public static void main(String[] args) {
        Coffee coffee = CoffeeFactory.createCoffee(CoffeeType.LATTE);
        System.out.println(coffee.getName()); // latte
    }
}
  • ์„ค๋ช… : Main ํด๋ž˜์Šค๋Š” ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋กœ, CoffeeFactory ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ LATTE ํƒ€์ž…์˜ ์ปคํ”ผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ ์ด๋ฆ„์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • ์—ญํ•  : ํŒฉํ† ๋ฆฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋กœ, ์ง์ ‘์ ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ํŒฉํ† ๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ์žฅ์ .

  • 1. ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ ์ฆ๊ฐ€.
    • ๊ฐ์ฒด ์ƒ์„ฑ ๋กœ์ง์ด ์ค‘์•™ํ™”๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์ƒˆ๋กœ์šด ์ปคํ”ผ ํƒ€์ž…์„ ์ถ”๊ฐ€ํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š” ์—†์ด ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • 2. ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ.
    • ๊ฐ์ฒด ์ƒ์„ฑ ์ฝ”๋“œ๊ฐ€ ํ•œ ๊ณณ์— ๋ชจ์—ฌ ์žˆ์–ด ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.
      • ๊ฐ์ฒด ์ƒ์„ฑ ๊ณผ์ •์—์„œ์˜ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋„ ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • 3. ์ฝ”๋“œ์˜ ๊ฒฐํ•ฉ๋„ ๊ฐ์†Œ.
    • ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋Š” ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค.

5๏ธโƒฃ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ๋‹จ์ .

  • 1. ํด๋ž˜์Šค์˜ ๋ณต์žก์„ฑ ์ฆ๊ฐ€.
    • ๊ฐ์ฒด ์ƒ์„ฑ์„ ์œ„ํ•œ ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค๊ฐ€ ์ถ”๊ฐ€๋จ์œผ๋กœ์จ ํด๋ž˜์Šค์˜ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ณ , ์ฝ”๋“œ ๊ตฌ์กฐ๊ฐ€ ๋‹ค์†Œ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • 2. ํ™•์žฅ ์‹œ ์ฃผ์˜ ํ•„์š”.
    • ์ƒˆ๋กœ์šด ์ปคํ”ผ ํƒ€์ž…์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค์˜ switch ๋ฌธ์ด๋‚˜ if-else ๋ฌธ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด, ํ™•์žฅ์„ฑ์ด ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์ด๋‚˜ ๋‹ค๋ฅธ ๋””์ž์ธ ํŒจํ„ด๊ณผ ๊ฒฐํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6๏ธโƒฃ ๊ฒฐ๋ก .

  • ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ๊ฐ์ฒด ์ƒ์„ฑ์˜ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๋Š” ๊ฐ•๋ ฅํ•œ ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.
    • ์œ„ ์ฝ”๋“œ ์˜ˆ์‹œ์—์„œ๋Š” ์ปคํ”ผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋กœ์ง์„ CoffeeFactory ํด๋ž˜์Šค์— ๋ชจ์•„๋‘์–ด, ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ ํŠน์ • ์ปคํ”ผ ํด๋ž˜์Šค์— ์ง์ ‘์ ์œผ๋กœ ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
      • ์ด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋Š” ์ปคํ”ผ ๊ฐ์ฒด์˜ ์ƒ์„ฑ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ ๋„ ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ์ปคํ”ผ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.