Posted:      Updated:

자바 디자인 패턴 스터디를 하며 ‘Java 객체 지향 디자인 패턴’ 교재를 정리한 글입니다.

팩토리 메서드 패턴(Factory Method Pattern)

  • 객체 생성의 변화에 대비
    1. 객체의 생성 코드를 별도의 클래스/메서드로 분리하는 방식
    2. 하위 클래스에서 적합한 클래스의 객체를 생성하는 방식

팩토리 메서드 패턴 컬레보레이션

  • Product
    • 팩토리 메서드로 생성될 객체의 공통 인터페이스
  • ConcreteProduct
    • 구체적으로 객체가 생성되는 클래스
  • Creator
    • 팩토리 메서드를 갖는 클래스
  • ConcreteCreator
    • 팩토리 메서드를 구현하는 클래스
    • ConcreteProduct 객체 생성

예시: 사과를 디저트로 제공하는 식당 클래스

전체 코드

public abstract class Apple {
    public abstract void wash();
    public abstract void peel();
    public abstract void slice();
}

public class Busa extends Apple{
    @Override
    public void wash() {
        System.out.println("부사: 물로 씻기");
    }

    @Override
    public void peel() {
        System.out.println("부사: 껍질 벗기기");
    }

    @Override
    public void slice() {
        System.out.println("부사: 자르기");
    }
}

public class Hongok extends Apple {
    @Override
    public void wash() {
        System.out.println("홍옥: 물로 씻기");
    }

    @Override
    public void peel() {
        System.out.println("홍옥: 껍질 벗기기");
    }

    @Override
    public void slice() {
        System.out.println("홍옥: 자르기");
    }
}

public class Hongro extends Apple {
    @Override
    public void wash() {
        System.out.println("홍로: 물로 씻기");
    }

    @Override
    public void peel() {
        System.out.println("홍로: 껍질 벗기기");
    }

    @Override
    public void slice() {
        System.out.println("홍로: 자르기");
    }
}

public class AppleFactory {
    public static Apple getApple(String kind) {
        Apple apple = null;
        if (kind.equals("busa")) {
            apple = new Busa();
        }
        else if (kind.equals("hongok")) {
            apple = new Hongok();
        }
        else if (kind.equals("hongro")) {
            apple = new Hongro();
        }
        return apple;
    }
}

public class Restaurant {
    public Apple servingApple(String kind) {
        Apple apple = null;
        apple = AppleFactory.getApple(kind);
        apple.wash();
        apple.peel();
        apple.slice();
        return apple;
    }
}

public class Home {
    public Apple getAppleForBreakFast(String kind) {
        Apple apple = null;
        apple = AppleFactory.getApple(kind);
        apple.wash();
        return apple;
    }
}

댓글남기기