Skip to content

Latest commit

ย 

History

History
130 lines (99 loc) ยท 3.76 KB

FactoryMethodPattern.md

File metadata and controls

130 lines (99 loc) ยท 3.76 KB

ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด(Factory Method Pattern)

written by sohyeon, hyemin ๐Ÿ’ก


1. ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด(Factory Method Pattern)

ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด(Factory Method Pattern)๊ฐ์ฒด ์ง€ํ–ฅ ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค.
Factory method๋Š” ๋ถ€๋ชจ(์ƒ์œ„) ํด๋ž˜์Šค์— ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŒจํ„ด์ด๋ฉฐ.
์ž์‹(ํ•˜์œ„) ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋„๋ก ํ•˜๋Š” ํŒจํ„ด์ด๊ธฐ๋„ ํ•˜๋‹ค.
๋ถ€๋ชจ(์ƒ์œ„) ํด๋ž˜์Šค ์ฝ”๋“œ์— ๊ตฌ์ฒด ํด๋ž˜์Šค ์ด๋ฆ„์„ ๊ฐ์ถ”๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋„ ์‚ฌ์šฉํ•œ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•ด, ๊ฐ์ฒด ์ƒ์„ฑ ๋กœ์ง์€ Factory๋ผ๋Š” ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•œ ํ›„
๊ฐ์ฒด ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ถ€๋ชจ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ subclass์— ์œ„์ž„ํ•˜๋Š” ํŒจํ„ด์ด๋‹ค.

1-1. UML Diagram

  • Creator

    • abstract factory method๋ฅผ ์ •์˜
    • factory method๋ฅผ ํ˜ธ์ถœํ•ด "Product"๋ฅผ ์ƒ์„ฑ
  • Concrete Creator

    • factory method๋ฅผ ๊ตฌํ˜„, concrete product instance ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜
  • Product

    • factory method์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋Š” product์˜ base class ํ˜น์€ interface
  • Concrete Product์˜ ์—ญํ• 

    • Product interface or class ๊ตฌํ˜„

2. ๊ตฌํ˜„ ์˜ˆ์‹œ

<์‹œ๋‚˜๋ฆฌ์˜ค>
์—ฌ๋Ÿฌ ๋ชจ์–‘์˜ ๋„ํ˜•์ด ์กด์žฌํ•  ๋•Œ ๊ฐ ๋„ํ˜• ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ ํ›„ ๋„ํ˜•์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.

Concrete Product

// Shape.java
public interface Shape {
    void draw();
}

// Circle.java
public class Circle implements Shape {
    @Override
    public void draw(){
        System.out.println("Circle draw");
    }
}

// Rectangle.java
public class Rectangle implements Shape {
    @Override
    public void draw(){
        System.out.println("Rectangle draw");
    }
}

// Square.java
public class Square implements Shape {
    @Override
    public void draw(){
        System.out.println("Square draw");
    }
}

Concrete Creator

// ShapeFactory.java
public class ShapeFctory {
    // Factory Method -> Product ์ƒ์„ฑ ํ›„ ๋ฐ˜ํ™˜
    public Shape getShape(String shapeType) {
        if(shapeType == null) {
            return null;
        }
        if(shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if(shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        } else if(shapeType.equalsIgnoreCase("SQUARE")) {
            return new Square();
        }
        return null;
    }
}

Creator

public class FactoryPatternEx {
    public static void main(String[] args) {
        // ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค ๊ฐ์ฒด ์ƒ์„ฑ
        ShapeFactory shapeFactory = new ShapeFactory();
        
        // ์›ํ˜• ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ
        Shape circle = shapeFactory.getShape("CIRCLE");
        circle.draw();

        // ์‚ผ๊ฐํ˜• ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ
        shape rectangle = shapeFactory.getShape("RECTANGLE");
        rectangle.draw();

        // ์‚ฌ๊ฐํ˜• ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ
        shape square = shapeFactory.getShape("SQUARE");
        square.draw();
    }
}

3. ๊ฒฐ๋ก 

  • Factory method pattern์€ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ , ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ƒˆ๋กœ์šด Product๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค class๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ, ์ ์  ํด๋ž˜์Šค๊ฐ€ ๋งŽ์•„์ง„๋‹ค.

-> ๊ฒฝ์šฐ์— ๋งž๋Š” ์‚ฌ์šฉ์ด ๋””์ž์ธ ํŒจํ„ด์˜ ํšจ์œจ์„ ๊ทน๋Œ€ํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ๋“ฏ ํ•˜๋‹ค.


Reference & Additional Resources