반응형
팩토리(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
반응형