티스토리 뷰
개발을 할 때 여러 가지 방법들이 있다.
그것을 디자인 패턴이라고 하는데 Factory Pattern(팩토리 패턴)도 그 디자인 패턴 중 하나이다.
(여러 글들을 보면 어디는 디자인패턴이 아니라고 하고 어디는 디자인패턴이라고 하지만 일단 나는 디자인패턴이라고 생각하겠다.)
Factory Pattern(팩토리 패턴)이란?
이름에 Factory(공장)이라는 이름이 들어간 패턴이라는 것을 보면 조금은 감이 올 수 있다.
하나의 공장에서 여러 제품을 만들어내듯이 공장 역할을 하는 객체에서 조건에 따라 분기를 해서 필요한 객체를 만들어내는 방식이 바로 팩토리 패턴이다.
하지만 공장에서 제품을 찍어내는 방식을 알다시피 옷을 만드는 공장에서 자동차를 만들어낼수는 없는 법이다. 즉, 공통점이 어느 정도 있는 객체를 생성하는 공장을 만들어내서 사용해야한다는 것이다.
완전 다른 객체를 생성하는 팩토리 객체를 만드느니 그것은 차라리 팩토리 패턴을 사용하지 않는게 낫다.
하지만 비슷한 큰 틀을 가진 Object를 분기에 따라 디테일한 부분을 바꿔 다르게 생성해서 사용해야할 때 사용하기 좋다.
Factory Pattern(팩토리 패턴) 구현 예
이론으로만 얘기해보면 와닿지 않는다. 그럼 간단한 예로 직접 팩토리 패턴을 구혀해보도록 하겠다.
예를 들어 어떤 홈페이지에 공지사항 게시판, 블로그 게시판, 사례 게시판 이렇게 3개의 게시판이 있다고 하자. 각 게시판들은 글 작성, 수정, 삭제 및 이미지 파일을 올리는 것이 공통으로 들어갈 것이다. 그리고 나머지 디테일하게 공지사항에는 글 작성 시 메일 알림 기능이, 블로그에는 댓글 기능이, 사례에는 분야별로 분류하는 기능 등 다른 기능들이 있다.
그러면 우선 각 게시판 객체 생성을 위해 공통으로 사용할 기능들을 정의할 interface를 만들어보자.
public interface Board {
void createWirting(WritingDto);
List<WritingDto> getWritingList();
WritingDto getWritingOne(long id);
void updateWriting(WritingDto);
void deleteWriting(long id);
}
그리고 각각 공지사항, 블로그, 사례에 사용되는 객체를 아래와 같이 Board interface를 상속 받아서 Board 객체의 함수들을 전부 오버라이딩 하고 각각 객체에서 필요한 기능들을 정의한다.
public Class Notice implement Board {
@Override
void createWirting(WritingDto){...}
@Override
List<WritingDto> getWritingList(){...}
@Override
WritingDto getWritingOne(long id){...}
@Override
void updateWriting(WritingDto){...}
@Override
void deleteWriting(long id){...}
void notificationEmail(){...}
}
이렇게 하면 게시판의 기본 기능이 들어간 객체가 각각 생성된다. 각 게시판에서 필요한 디테일한 기능의 경우도 다 따로따로 정의할 수 있다.
그리고 각 게시판들 객체를 조건에 따라 생성할 BoardManager를 생성한다. 이게 바로 팩토리 패턴에서 팩토리(공장) 역할을 한다.
여기서 조건을 분기하는 방법은 각자 편한대로 하면 된다. 여기서는 간단하게 switch를 사용해봤다.
public Class BoardManager {
private Board board;
@PostConstruct
public void init(String boardType) {
switch(boardType) {
case "Notice":
board = new Notice();
break;
case "blog":
board = new Blog();
break;
case "case":
board = new Case();
break;
}
}
public void createWriting(WritingDto writingDto) {
board.createWriting(WritingDto writingDto);
}
}
이와 같이 정의를 하면 서비스 단에서 BoardManager를 통해 필요한 게시판의 객체를 생성하고 사용할 수 있다.
@RequiredArgsConstructor
@Service
public Class NoticeService() {
private final BoardManager boardManager;
public void createNotice(WritingDto writingDto) {
boardManager.createWriting(writingDto);
}
....
}
이와 같이 하나의 객체에서 여러 비슷한 객체들을 분기에 따라 만들어내는 것을 바로 팩토리 패턴이라고 한다.
꼭 좋다!!라는 디자인패턴은 아니고 해당 어플리케이션이 어떤 로직으로 동작하느냐에 따라 좋을 수도 있고 아니면 오히려 번거로운 방법이 될 수 있다.
'Java' 카테고리의 다른 글
ApplicationContext란?(BeanFactory와의 차이점) (2) | 2021.08.10 |
---|---|
@Bean과 @Component 차이점 (0) | 2021.08.08 |
[ Lombok ] dependency 설정을 했으나 lombok 어노테이션 에러 발생시 해결 방법 (1) | 2021.07.28 |
[ Mock ] Static 함수가 포함된 함수 단위 테스트 하기 (0) | 2021.07.27 |
[ Enum ] AttributeConverter를 이용해 DB에 값 그대로 저장하기 (0) | 2021.07.20 |
- Total
- Today
- Yesterday
- 공간데이터
- mockito
- Spring
- 자바
- 캐시
- DB
- k8s
- 스프링부트
- Caching
- MAC
- 어노테이션
- cache
- 이클립스
- 데이터베이스
- 역직렬화
- JPA
- 메시지큐
- annotation
- enum
- postgres
- eclipse
- rabbitmq
- HttpClient
- Intellij
- 캐싱
- ssh
- Java
- PostgreSQL
- DATABASE
- springboot
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |