jujuwon
시크릿주주
jujuwon
전체 방문자
오늘
어제
  • 분류 전체보기 (106)
    • 🔠 프로그래밍언어 (35)
      • ☕️ Java (19)
      • 🐠 Python (15)
      • 🍠 Kotlin (1)
    • 🔙 Backend (16)
      • 🌿 Springboot (12)
      • 🐳 Docker (1)
      • ☁️ AWS (3)
    • 💼 CS (12)
      • 📶 Network (12)
    • 🕹 알고리즘 (14)
      • 📑 스터디 (2)
      • 💁🏻‍♂️ 백준 (9)
      • 👨🏼‍🔬 프로그래머스 (3)
    • 📚 Book (8)
      • 🔎 오브젝트 (4)
      • 🧪 TDD (2)
      • 📜 논문 (2)
    • 🔐 보안 (7)
      • 👾 Pwnable (7)
    • 📝 회고 (4)
    • 🧩 etc. (10)
      • ⚠️ issue (2)
      • 💡 꿀팁 (7)
      • ✏️ 끄적 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 글

hELLO · Designed By 정상우.
jujuwon

시크릿주주

Java :: 팩토리(Factory) 메소드 패턴
🔠 프로그래밍언어/☕️ Java

Java :: 팩토리(Factory) 메소드 패턴

2022. 12. 12. 16:44
반응형

 

팩토리(Factory) 메소드 패턴


  • 객체 생성 처리를 서브 클래스로 분리하여 처리하도록 캡슐화하는 패턴

 

특정 입력값에 따라 다른 객체를 생성해야 할 때,

분기에 따라서 객체를 생성할 때 팩토리 메소드 패턴을 적용하면 좋다.

조건에 따라 객체를 생성하는 공장을 만드는 느낌 !

 

장점

  • 객체간의 결합도가 낮아지고 유지보수에 용이해짐
  • 객체들을 한 곳에서 관리할 수 있게 됨
  • 메소드로 작동하기 때문에 리턴 값으로 서로 다른 객체를 반환할 수 있음

단점

  • 불필요하게 많은 클래스를 정의하게 될 수 있음

 

예시 코드

  • 팩토리 메소드 패턴 적용 전
abstract class Item { }

class OrangeJuice extends Item {
    OrangeJuice() {
        System.out.println("오렌지쥬스 생성");
    }
}

class MelonJuice extends Item {
    MelonJuice() {
        System.out.println("멜론쥬스 생성");
    }
}

class GreenTea extends Item {
    GreenTea() {
        System.out.println("녹차 생성");
    }
}

class VendingMachine {
    Item provideItem(String type) {
        Item returnItem = null;

        if (type.equals("오렌지쥬스")
            returnItem = new OrangeJuice();
        else if (type.equals("멜론쥬스")
            returnItem = new MelonJuice();
        else if (type.equals("녹차")
            returnItem = new GreenTea();            
        return returnItem;
    }
}

class Buyer {
    public static void main(String[] args) {
        VendingMachine vm = new VendingMachine();
        vm.provideItem("오렌지쥬스");
        vm.provideItem("녹차");
    }
}

자판기를 여러개 만든다고 생각하면 중복된 분기처리 코드가 들어가게 된다.

또 결합도가 높게 코드가 짜여져 있기 때문에 유지보수하기가 어렵다.

 

  • 팩토리 메소드 패턴 적용 후
abstract class Item { }

class OrangeJuice extends Item {/* 생략 */}
class MelonJuice extends Item {/* 생략 */}
class GreenTea extends Item {/* 생략 */}

class ItemFactory {
    public Item createItem(String type) {
        Item returnItem = null;

        if (type.equals("오렌지쥬스")
            returnItem = new OrangeJuice();
        else if (type.equals("멜론쥬스")
            returnItem = new MelonJuice();
        else if (type.equals("녹차")
            returnItem = new GreenTea();            
        return returnItem;
    }
}

class VendingMachine {
    Item provideItem(String type) {
        ItemFactory factory = new ItemFactory();
        return factory.createItem(type);
    }
}

class Buyer {
    public static void main(String[] args) {
        VendingMachine vm = new VendingMachine();
        vm.provideItem("오렌지쥬스");
        vm.provideItem("녹차");
    }
}

java.util.Calendar 등에서 사용하고 있고 정말 많이 사용되는 패턴 중 하나 !

잘 익혀두자.

 

728x90
반응형
저작자표시 (새창열림)
    '🔠 프로그래밍언어/☕️ Java' 카테고리의 다른 글
    • Java :: 어노테이션(Annotation)
    • Java :: 열거형 - Enumeration
    • Java :: 싱글톤(Singleton) 패턴
    • Java :: 디자인 패턴
    jujuwon
    jujuwon

    티스토리툴바