이카's
article thumbnail
Published 2023. 5. 30. 04:04
팩토리 패턴(Factory) - Java Language/Java

팩토리 패턴(Factory)

일반적으로 하나의 클래스에 여러개를 만드는 패턴이다. 하지만 상위 클래스가 뼈대를 이루고 하위 클래스가 상새내용을 적는 부분에서 팩토리 패턴이라는 명칭이 붙여졌다.

 

 

팩토리 패턴?

팩토리 패턴은 생성 패턴으로 생성패턴에는 두 가지 중요한 점이 있다.

  1. 생성 패턴은 어떤 Class를 사용하는지 캡슐화를 한다.
  2. 인스턴스들의 결합, 생성에 대한 정보를 은닉한다.

즉, 생성 시점, 누가 사용하는지, 무엇이 생성되는지 등등 유연성을 가질 수 있다.

 

문제점 or 단점

  1. 코드양 증가
  2. 코드파악 난이도 증가

 

코드양 증가

싱글톤 패턴과 비교했을 때, interface를 구현하고, 아래 클래스에서 세부적인 내용을 구현하기 때문에 코드 양이 많아지는 단점이 있다.

 

코드파악 난이도

extends 하는 과정에서 상위 클래스를 봐야 하기 때문에 파악하는데 시간이 오래 걸릴 수 있고 난이도 또한 높아진다.

 

장점 or 해결 or 결과

팩토리 패턴은 크게 두가지의 장점이 있다.

  1. 확장성 & 유지보수
  2. 테스트 용이

 

확장성 & 유지보수

객체 생성로직이 분리된 방식이 팩토리 패턴이다. 핵심은 분리이다. 분리가 되었기 때문에 상호관계가 느슨한 결합을 가지고, 상위 클래스에서는 인스턴스 생성 방식에 대해 알 필요가 없어진다.
즉, 유연성을 가지게 된다.

또한 새로운 타입에 추가가 쉽다. 부모 클래스를 상속받아 이에 따라 세부적인 내용만 구현하면 되기 때문에 확장성을 가진다.

이는 SOLID 원칙Open Closed Principle(개방 폐쇄 원칙)을 따르게 된다.
기존의 코드(부모 클래스)는 변경하지 않으면서 추가할 기능(자식 클래스)는 구현 가능한 원칙을 말한다.

 

테스트 용이

부모와 자식의 클래스가 분리되어 있다. 따라서 부분적으로 테스트가 가능하고, 이는 테스트의 방식이 단위 테스트를 하기 편해진다는 뜻을 의미한다.

 

해결

단점이자 문제점인 부분은 물리적인 부분이므로 크게 해결할 수가 없다.

 

구현

// 부모 클래스
abstract class Coffee { 
    public abstract int getPrice(); 

    @Override
    public String toString() {
        return "Hi this coffee is " + this.getPrice();
    }
}

// 팩토리 패턴
class CoffeeFactory { 
    public static Coffee getCoffee(String type, int price) {
        if ("Latte".equalsIgnoreCase(type)) return new Latte(price);
        else if ("Americano".equalsIgnoreCase(type)) return new Americano(price);
        else {
            return new DefaultCoffee();
        } 
    }
}

// ------- 자식 패턴 --------
class DefaultCoffee extends Coffee {
    private int price;

    public DefaultCoffee() {
        this.price = -1;
    }

    @Override
    public int getPrice() {
        return this.price;
    }
}
class Latte extends Coffee { 
    private int price; 

    public Latte(int price) {
        this.price = price; 
    }
    @Override
    public int getPrice() {
        return this.price;
    } 
}
class Americano extends Coffee { 
    private int price; 

    public Americano(int price) {
        this.price = price; 
    }
    @Override
    public int getPrice() {
        return this.price;
    } 
} 

// 테스트 코드
@test
public class HelloWorld { 
     public static void main(String[] args) { 
        Coffee latte = CoffeeFactory.getCoffee("Latte", 4000);
        Coffee ame = CoffeeFactory.getCoffee("Americano", 3000); 
        System.out.println("Factory latte ::" + latte);
        System.out.println("Factory ame ::" + ame); 
     }
} 

 

Referance

참고 자료
CS전공지식노트

반응형
profile

이카's

@Edan Cafe ☕

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!