1. Factory Method Pattern
팩토리는 공장이라는 뜻입니다. 즉 팩토리 메소드 패턴도 무엇인가를 만들어내는 공장이라고 생각하면 됩니다.
객체를 만들어내는 부분을 서브 클래스에 위임하는 패턴.
즉, new 키워드를 통해서 객체를 만드는 코드를 서브 클래스에 위임하겠다는 것입니다. 결국 팩토리 메소드 패턴은 객체를 만들어내는 공장을 만드는 패턴이라고 생각하시면 됩니다.
2. Example
이제 예제를 진행하면서 알아보겠습니다. 예제에서 사용할 객체는 "로봇"입니다. 여러 종류의 로봇을 만드는 공장을 생성해보겠습니다.
2.1 Structure
예제에서 만들 로봇의 종류는 "SuperRobot"과 "PowerRobot"입니다. 그리고 로봇을 생산해내는 로봇공장은 "SuperRobotFactoy"와 "ModifiedSuperRobotFactory"입니다.
Robot(abstract class)
┗ SuperRobot
┗ PowerRobot
RobotFactory(abstract class)
┗ SuperRobotFactory
┗ ModifiedSuperRobotFactory
2.2 Robot
추상 클래스인 Robot을 만들고 추상 클래스를 상속하는 SuperRobot과 PowerRobot 클래스 입니다. 각각의 로봇 클래스 마다 getName의 메소드를 구현해주었습니다. 특별할게 없는 코드입니다.
public abstract class Robot {
public abstract String getName();
}
public class SuperRobot extends Robot {
@Override
public String getName() {
return "SuperRobot";
}
}
public class PowerRobot extends Robot {
@Override
public String getName() {
return "PowerRobot";
}
}
2.3 RobotFactory
이제 로봇을 생산하는 공장 클래스를 만들겠습니다.
public abstract class RobotFactory {
abstract Robot createRobot(String name);
}
아래는 RobotFactory 클래스를 상속받아 구현한 SuperRobotFactory 클래스 입니다. 파라미터로 넘어오는 name에 따라서 인스턴스를 반환해주거나 case에 없는 name일 경우 null을 반환합니다.
public class SuperRobotFactory extends RobotFactory {
@Override
Robot createRobot(String name) {
switch( name ){
case "super": return new SuperRobot();
case "power": return new PowerRobot();
}
return null;
}
}
아래는 SuperRobotFactory 클래스와 비슷하지만 내부 구현이 조금 다릅니다. 로봇 클래스의 이름을 String 파라미터로 받아서 직접 인스턴스를 만들어 냅니다.
public class ModifiedSuperRobotFactory extends RobotFactory {
@Override
Robot createRobot(String name) {
try {
Class<?> cls = Class.forName(name);
Object obj = cls.newInstance();
return (Robot)obj;
} catch (Exception e) {
return null;
}
}
}
2.4 Test Code
메인 프로그램에서는 new 키워드가 없음을 알 수 있습니다. 객체 생성을 팩토리 클래스에 위임했기 때문입니다. 메인 프로그램은 어떤 객체가 생성 되었는지 신경 쓰지 않고 반환된 객체만 사용하면 됩니다. 또한 새로운 로봇이 추가 되더라도 메인 프로그램에서 변경할 코드는 최소화 됩니다.
public class FactoryMain {
public static void main(String[] args) {
RobotFactory rf = new SuperRobotFactory();
Robot r = rf.createRobot("super");
Robot r2 = rf.createRobot("power");
System.out.println(r.getName());
System.out.println(r2.getName());
RobotFactory mrf = new ModifiedSuperRobotFactory();
Robot r3 = mrf.createRobot("pattern.factory.SuperRobot");
Robot r4 = mrf.createRobot("pattern.factory.PowerRobot");
System.out.println(r3.getName());
System.out.println(r4.getName());
}
}
#실행 결과
SuperRobot
PowerRobot
SuperRobot
PowerRobot
3. 팩토리 메소드 사용 이유
팩토리 메소드 패턴을 사용하는 이유는 클래스간의 결합도를 낮추기 위한것입니다. 결합도라는 것은 간단히 말해 클래스의 변경점이 생겼을 때 얼마나 다른 클래스에도 영향을 주는가입니다. 팩토리 메소드 패턴을 사용하는 경우 직접 객체를 생성해 사용하는 것을 방지하고 서브 클래스에 위임함으로써 보다 효율적인 코드 제어를 할 수 있고 의존성을 제거합니다. 결과적으로 결합도 또한 낮출 수 있습니다.
REFERENCE
'디자인패턴' 카테고리의 다른 글
템플릿 메소드(Template Method Pattern) 패턴이란? (0) | 2020.07.13 |
---|---|
빌더 패턴(Builder Pattern)이란? (0) | 2020.07.13 |
MVC 패턴이란 (0) | 2020.03.24 |
디자인패턴이란 (0) | 2019.10.08 |