Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 스프링부트
- 유효시간 설정 url
- NestJS
- Dev-Matching
- 음악 url 파일 다운로드
- invalid_grant
- api 요청 수 제한
- bucket4j
- 파일 url
- oauth
- 우아한 테크코스
- 검색
- TypeORM
- redis
- 자바스크립트
- 우아한테크코스
- 프론트엔드
- api 비동기처리
- 딥다이브
- 타입스크립트
- this
- 프론트엔드 과제
- 모던 자바스크립트
- concurrency limit
- 프로그래머스
- compateto
- Deep Dive
- AWS
- 프리코스
- 코멘토 #코멘토실무PT #실무PT후기 #실무강의 #리액트강의 #웹프로그래밍 #react #웹개발실무
Archives
- Today
- Total
개발 알다가도 모르겠네요
Abstract Pattern 을 알아보자 본문
728x90
관련성이 있는 여러 종류의 객체를 일관된 방식으로 생성할 때 유용
Example - 엘리베이터 만들기
Template Method 패턴을 적용
class Motor {
public void move(Direction direction) {
// 1) 이미 이동 중이면 무시한다.
// 2) 만약 문이 열려 있으면 문을 닫는다.
// 3) 모터를 구동해서 이동시킨다. 이 부분만 LG, 현대에서 달라짐 // 4) 모터의 상태를 이동중으로 설정한다.
}
}
class Door {
public void open() {
// 1) 이미 문이 열려있으면 무시한다.
// 2) 문을 연다.이 부분만 LG, 현대에서 달라짐
// 3) 문의 상태를 열림으로 설정한다. }
}
class DirectionLamp {
public void light(Direction direction) {
// 1) 램프의 상태가 미미 이동방향으로 설정되어 있으면 무시
// 2) 램프를 이동방향으로 설정이 부분만 LG, 현대에서 달라짐
// 3) 램프의 상태를 이동방향으로 설정한다. }
}
Template Method 패턴 적용시 문제점
New 연산자 사용으로 인한 OCP 위배
- Lg 엘리베이터에서 현대 엘리베이터로 변경할 때 기존 코드를 변경
public class ElevatorCreator {
public static Elevator assembleElevator() {
Elevator elevator = new HyundaiElevator();
Motor motor = new HyundaiMotor();
elevator.setMotor(motor);
Door door = new HyundaiDoor();
elevator.setDoor(door);
motor.setDoor(door);
DirectionLamp lamp = new HyundaiLamp();
elevator.setLamp(lamp);
return elevator;
}
public static void main(String[] args) {
Elevator elevator = assembleElevator();
elevator.move(Direction.UP);
}
}
Factory Method 패턴을 적용
public class ElevatorFactory {
public static Elevator createElevator(VendorID vendorID) {
Elevator elevator= null ;
switch ( vendorID ) {
case LG : elevator = new LgElevator() ; break ;
case HYUNDAI : elevator = new HyundaiElevator() ; break
;
}
return elevator; }
}
public class MotorFactory {
public static Motor createMotor(VendorID vendorID) {
Motor motor = null ;
switch ( vendorID ) {
case LG : motor = new LGMotor() ; break ;
case HYUNDAI : motor = new HyundaiMotor() ; break ; }
return motor ;
} }
public class DoorFactory {
public static Door createDoor(VendorID vendorID) {
Door door = null ;
switch ( vendorID ) {
case LG : door = new LGDoor() ; break ;
case HYUNDAI : door = new HyundaiDoor() ; break ; }
return door ;
} }
public class LampFactory {
public static Lamp createLamp(VendorID vendorID) {
DirectionLamp lamp = null ;
switch ( vendorID ) {
case LG : lamp = new LgLamp) ; break ;
case HYUNDAI : lamp = new HyundaLamp() ; break ; }
return lamp;
} }
public class ElevatorCreator {
public static Elevator assembleElevator() {
Elevator elevator = new LgElevator(); Motor motor = new LgMotor(); elevator.setMotor(motor);
Door door = new LgDoor(); elevator.setDoor(door); motor.setDoor(door);
DirectionLamp lamp = new LgLamp();
elevator.setLamp(lamp);
return elevator;
}
public static void main(String[] args) { Elevator elevator = assembleElevator(); elevator.move(Direction.UP);
} }
Factory Method 패턴 적용시 문제점
- 만약 다른 제조업체의 부품을 사용해야 한다면? 현대의 부품(HyundaiMotor와 HyundaiDoor)를 사용해야 한다면?
- 새로운 제조업체의 부품을 사용해야 한다면? SamsungMotor와 SamsungDoor 클래스를 사용해야 한다면?
해결책
부품이 아니라 제조업체 별로 팩토리를 정의.
제조업체의 팩토리 클래스의 공통 추상 팩토리 클래스를 정의
![](https://blog.kakaocdn.net/dn/liAJp/btrnAh7BTJR/FyeE71hLekNlNXU1KGN4E0/img.png)
제조업체 별 팩토리는 1개만 필요하다면 싱글턴 패턴을 적용.
if ( vendorName.equalsIgnoreCase("LG") )
factory = new LGElevatorFactory() ;
else if ( vendorName.equalsIgnoreCase("Samsung") )
factory = new SamsungElevatorFactory() ;
else
factory = new HyundaiElevatorFactory() ;
'디자인패턴' 카테고리의 다른 글
Composite Pattern 을 알아보자 (0) | 2021.12.22 |
---|---|
Bridge Pattern 을 알아보자 (0) | 2021.12.20 |
Factory Method Pattern 을 알아보자 (0) | 2021.12.17 |
Template Method Pattern 을 알아보자 (0) | 2021.12.15 |
Decorator Pattern 을 알아보자 (0) | 2021.12.14 |