팩토리 패턴이란?

팩토리 패턴은 생성 패턴 중 하나
객체 생성을 캡슐화함
두 가지 종류가 있는데 팩토리 메소드 패턴, 추상 팩토리 패턴이다

 

두 종류를 알아보기 전에 심플 팩토리 패턴이란?

  • 위 언급된 두 종류의 베이스
  • 객체를 생성하는 클래스를 따로 빼 놓음
public class CutletFactory {

	Cutlet orderCutlet(String type) {
		Cutlet cutlet = null;

		if (type.equals("cheese")) {
			cutlet = new CheeseCutlet();
		} else if (type.equals("sweetPotato")) {
			cutlet = new SweetPotatoCutlet();
		}

		return cutlet;
	}
}

public class CheeseCutlet extends Cutlet {

    public CheeseCutlet() {
        System.out.println("치즈돈까스");
    }
}

public class SweetPotatoCutlet extends Cutlet {

	public CheeseCutlet() {
        System.out.println("고구마돈까스");
    }
}


public class Test {
    public static void main(String[] args){
        CutletFactory factory = new CutletFactory();
        Cutlet cutlet = factory.orderPhone("cheese");
    }
}
심플 팩토리 패턴을 팩토리 메소드 패턴이라 착각하고 있었고 확실히 알게 되는 순간이었다

 

팩토리 메소드 패턴

  • 어떤 객체를 만들지 서브 클래스에서 결정
  • 다시 말하면 객체를 만드는 일을 서브 클래스로 위임하는 것
public class Test {
    public static void main(String[] args) {

        CutletMethodFactory wugaFactory = new WugaCutletMethodFactory();
        Cutlet wugaCutlet = wugaFactory.createCutlet();

        CutletMethodFactory jinFactory = new JinCutletMethodFactory();
        Cutlet jinCutlet = jinFactory.createCutlet();
    }
}

public interface CutletMethodFactory {

    default Cutlet orderCutlet() {
        return createCutlet();
    }

    Cutlet createCutlet();
}

public class WugaCutletMethodFactory implements CutletMethodFactory {

    @Override
    public Cutlet createCutlet() {
        System.out.println("정욱공장");
        return new Cutlet();
    }
}

public class JinCutletMethodFactory implements CutletMethodFactory {

    @Override
    public Cutlet createCutlet() {
        System.out.println("나라공장");
        return new Cutlet();
    }
}

 

추상 팩토리 패턴

  • 구상 클래스에 의존하지 않고 서로 연관되어 있거나 의존적인 객체로 이루어진 제품군을 생산하는 인터페이스 제공
  • 구상 클래스는 서브 클래스에서 만듦
  • 보통 팩토리 메소드를 포함하여 구현하는 경우가 많다고 함
나는 팩토리 안에 팩토리를 생각했다

  • 묶을 수 있는 제품군들이 있을 때, 쉽게 대체할 수 있다는 장점이 있다
  • 새로운 클래스가 생겼을 때엔 팩토리의 서브 클래스에서 수정을 해야함
복사했습니다!