[디자인패턴]팩토리 패턴 (Factory Pattern)

팩토리 패턴이란?

우리는 객체를 생성할 때 new 키워드를 이용한다. 생성하고자하는 객체는 다양한 경우, 어떠한 방식으로 설계 해야할까?

예를 들어, 피자 클래스에는 하위로 페퍼로니 피자, 고구마 피자가 있다고 하자. 피자 가게 클래스에서 이들 객체를 생성을 아래와 같이 했다고 하자.

Pizza pizza; 
if(type == "pepperoni") {
	pizza = new Pepperoni();
} else if(type =="sweetPotato"){
   pizza = new SweetPotato();
}

만약, 더 많은 종류의 피자가 추가 된다면, 피자 가게 클래스의 if-else 문이 수정되어야 한다. 이는 ocp(open close principle)을 위배하게 된다.

위와 같은 문제를 피하기 위해서 우리는 팩토리 클래스를 이용하여 객체들의 생성에 대한 책임을 가지도록 만드는 것이 팩토리 패턴이다.

팩토리 패턴은 생성 코드를 별도의 클래스로 분류하여 객체 의 생성을 분리하는 패턴이다.

팩토리 패턴 UML 다이어그램과 특징

팩토리 패턴은 위와 같은 UML 다이어그램을 가진다.
Creator은 factory 메소드를 가지는 클래스로 생성 하는 역할을 한다.
Product는 생성하고자 하는 객체의 인터페이스이다. 이에 대한 구체 클래스가 ConcreteProduct이다.
ConcreteCreator 클래스는 concreateProduct를 생성하는 creator의 상속을 받은 클래스이다.

팩토리 패턴은 싱글톤 패턴과 함께 쓰인다. 생성하고자하는 패턴 객체를 단 하나만 이용하도록 한 것이다.

팩토리 패턴 예시

다음은 모터를 구동하여 엘리베이터를 이동시키는 프로그램의 코드이다. motorFactory 클래스를 이용하여 motor을 생성해주는 코드이다.

public class motorFactory{
	public static Motor getMotor(String code){ 
    		Motor m; 
            	switch(code){
                	case 'LG': 
                    		m = new LGMotor();
                        	break; 
                     	case 'Hyundai': 
                        	m = new HyundaiMotor(); 
                            break ; 
                    }
                    return m; 
}

motor 클래스와 motor의 자식 클래스들은 다음과 같다.

//모터 추상 클래스
public abstract class Motor {
 private MotorStatus motorStatus;
	 public Motor() {
 		motorStatus = MotorStatus.STOPPED;
	 }
	 public MotorStatus getMotorStatus() {
		 return motorStatus;
 	}
 	private void setMotorStatus(MotorStatus motorStatus) {
 		this.motorStatus = motorStatus;
	 }
 	private void move(Direction direction) {
		 MotorStatus motorStatus = getMotorStatus();
 		if (motorStatus == MotorStatus.MOVING)
			 return;
		 moveMotor(direction);
		 setMotorStatus(MotorStatus.MOVING);
 	}
}

//LG 모터 부분
public class LGMotor extends Motor {
 protected void moveMotor(Direction direction) {
	 System.out.println(“move LG Motor “ + direction);
 	}
}
//Hyundai 모터 부분
public class HyundaiMotor extends Motor {
 protected void moveMotor(Direction direction) {
 	System.out.println(“move Hyundai Motor “ + direction);
 	}
}

모터를 이용하는 엘리베이터 컨트롤러 생략.

//Client 코드 일부 
Motor motor = MotorFactory.getMotor(id, lgMotor); 
Elevatorcontroller c1= new ElevatorController(1, motor) ; 

c1.gotoFloor(5); 

클라이언트의 코드를 보면 나는 lg 모터를 이용할꺼야하고 팩토리를 이용하여 모터를 간접 생성하였다. 생성한 모터를 파라미터 값으로 컨트롤러를 생성하였고, 이를 이용해 gotoFloor 즉 원하는 오퍼레이션을 실행할 수 있게 된다.

좋은 웹페이지 즐겨찾기