개발 알다가도 모르겠네요

Abstract Pattern 을 알아보자 본문

디자인패턴

Abstract Pattern 을 알아보자

이재빵 2021. 12. 19. 00:21
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 패턴 적용시 문제점

  • 만약 다른 제조업체의 부품을 사용해야 한다면?  현대의 부품(HyundaiMotorHyundaiDoor)를 사용해야 한다면?
  • 새로운 제조업체의 부품을 사용해야 한다면?  SamsungMotorSamsungDoor 클래스를 사용해야 한다면?

 

해결책

부품이 아니라 제조업체 별로 팩토리를 정의.

 

 

제조업체의 팩토리 클래스의 공통 추상 팩토리 클래스를 정의

 

제조업체 별 팩토리는 1개만 필요하다면 싱글턴 패턴을 적용.

if ( vendorName.equalsIgnoreCase("LG") ) 
	factory = new LGElevatorFactory() ;
else if ( vendorName.equalsIgnoreCase("Samsung") ) 
	factory = new SamsungElevatorFactory() ;
else
	factory = new HyundaiElevatorFactory() ;