안녕하세요. 풀스택개발자를 지향하는 진쓰입니다.
디자인패턴 팩토리메소드 포스팅 시작하겠습니다.
목적
- 개발자는 객체를 생성해서 사용해야하는데, 어떤 객체를 생성할지, 어떤 객체가 생성가능할지 없을 때 사용할 수 있습니다.
활용
- 생성할 객체 타입을 예측할 수 없을 때 활용합니다.
- 객체 생성의 책임을 하위 클래스에게 위임시키고, 어느 하위 클래스에게 위임했는지에 대한 정보를 은닉하고자 할 때 활용합니다.
목적과 활용으로 봐서는 감이 안오실수있습니다. 예제를 통해 살펴보고 설명하도록 하겠습니다.
예제
- 교통수단이 되는 것을 만들어내는 회사가 있다. 이회사는 택시와 자전거를 만들어내는 회사다.
코드리뷰
- 구성
TransProduct.java |
public abstract class TransProduct { abstract void useTrans(); } |
TransProduct_Taxi.java |
public class TransProduct_Taxi extends TransProduct { @Override void useTrans() { System.out.println("Using Taxi"); } } |
TransProduct_Bicycle.java |
public class TransProduct_Bicycle extends TransProduct { @Override void useTrans() { System.out.println("Using Bicycle"); } } |
.
TransCreator.java |
//추상 클래스. //Caller는 Interface혹은 abstract 클래스를 통해, Callee와 연결해야된다. public abstract class TransCreator { //TransProduct 생성하는 팩토리 메소드(자전거, 택시) public abstract TransProduct transCreate(String trans); } |
RealTransCreator_TransCompany.java |
public class RealTransCreator_TransCompany extends TransCreator { @Override public TransProduct transCreate(String trans) { if(trans.equals("taxi")){ return new TransProduct_Taxi(); } else{ return new TransProduct_Bicycle(); } } } |
Main.java |
public class Main { public static void main(String[] args) { //교통수단을 만들어내는 생산자 선언. TransCreator tc = new RealTransCreator_TransCompany(); //Caller(Main)은 Callee를 직접변수를 선언하지않고 생성. //항상 인터페이스(중간매체, 추상클래스포함)를 통해 생성. TransProduct tp; //교통수단 - 자전거 생성 tp = tc.transCreate("bicycle"); //자전거 기능 이용. tp.useTrans(); //교통수단 - 택시 생성 tp = tc.transCreate("taxi"); //택시 기능 이용. tp.useTrans(); } } |
결과화면
UML
- UML 설명
TransCreator 클래스가 부모 클래스 입니다.
RealTransCreator가 진짜 객체를 만드는 클래스 입니다.
여기선 RealTransCreator가 Bicycle과 Taxi를 생성하여(TransProduct)반환한다.
*) 여기서 회사가 만들어내는 제품이 늘어난다면?
(1) TransProduct 상속받는 클래스 추가합니다.
(2) RealTransCreator_TransCompany(Product를 생성하는 클래스)에서도 transCreate 수정합니다.
(Product가 늘어났으니!,dependency 관계니깐)
RealTransCreator_TransCompany는 TransProduct_Bicycle, TransProduct_Taxi와 dependency 관계라서 Product가 늘어났다는것은 RealTransCreator_TransCompany역시 수정되어야 한다는 의미이다.
점선화살표는 dependency 를 의미합니다.
객체지향 원칙
Caller는 Callee를 직접 만들어 호출하지 않는다.
=> 여기선, TransCreator에서 TransProdcut_Taxi와 TransProduct_Bicycle을 만들 수 있지만,
RealTransCreator_TransComapny 라는 sub 클래스를 하나 둬서 , 실제 TransProduct를 생성하여 반환하도록 하였다.
이처럼 객체지향언어에서는 Caller는 Callee를 직접만들어 호출하지않고 한단계를 더 둔다=>결합도를 떨어트리기 위해서이다.
정독해주셔서 감사합니다 :)
'소프트웨어공학 > 디자인패턴 - JAVA' 카테고리의 다른 글
추상 팩토리 패턴 (Abstract factory pattern) (0) | 2020.05.09 |
---|---|
전략 패턴 Strategy pattern (0) | 2017.06.10 |
어댑터 패턴 Adapter Pattern (0) | 2017.06.10 |
상태패턴 State Pattern (0) | 2017.06.10 |
싱글톤 패턴 Singleton pattern (0) | 2017.06.09 |