구상 클래스를 바탕으로 코딩하면 나중에 코드를 수정해야 할 가능성이 커지고, 유연성이 떨어진다.
일련의 구상 클래스가있다면 어쩔 수 없이 다음과 같은 코드를 만들어야 한다.
1 2 3 4 5 6 7 8 9 10 | Duck duck; if(picnic) { duck = new MallardDuck(); } else if(hunting) { duck = new DecoyDuck(); } else if(inBathTub) { duck = new RubberDuck(); } | cs |
만약 무언가 바뀌면 코드를 직접 건드려야 한다.
그렇기 때문에 위에 잇는 것을 통으로 Factory 함수로 넘긴다.
이렇게 캡슐화하면 무슨 장점이 잇는 걸까?
아까 문제를 그냥 다른 객체로 넘겨버렸을 뿐인데 말이다.
오리를 선택지에 따라 생성하는 클라이언트가 많을 수 있다.
따라서 코드의 재사용성을 높인 것이다.
팩토리는 정적 메소드로 선언한 디자인이 많다.
이것을 정적 팩토리(static factory)라고 한다.
왜 정적 메소드를 쓰냐면 객체 생성 메소드를 실행하려고 객체의 인스턴스를 만들지 않아도 되기 때문이다.
하지만 자식클래스를 만들어서 factory의 행동을 변경할 수 없다는 단점이 있다.
간단한 팩토리(Simple Factory)
간단한 팩토리(Simple Factory)는 디자인 패턴이라기 보다는 프로그래밍에서 자주 쓰이는 관용구에 가깝다.
간단한 팩토리를 팩토리 패턴이라고 부르는 사람들도 있다.
그러나 정확히 패턴은 아니다.
구상 클래스만 구현하는 팩토리가 간단한 팩토리(Simple Factory)다.
팩토리 메소드(Factory Method)
객체의 생성을 자식클래스에 위임하는 팩토리
기존 코드의 변경 없이 팩토리를 다양하게 만들 수 있다.
OCP를 지킬 수 있게 된다.
단점; 간단한 기능을 사용할 때보다 많은 클래스를 정의해야 하기 때문에 코드량이 증가한다.
추상 팩토리(Abstract Factory)
팩토리 메소드 패턴은 팩토리를 OCP를 지키면서 다양화시킬 수 있는 패턴이고
추상 팩토리패턴은 연관된 객체들의 생성을 하나의 팩토리에서 전담하는 패턴이다.