Reference - https://jdm.kr/blog/180
객체를 만들어내는 부분을 서브 클래스(Sub-Class)에 위임하는 패턴.
즉, new 키워드를 호출하는 부분을 서브 클래스에 위임하는 겁니다. 결국 팩토리 메소드 패턴은 객체를 만들어내는 공장(Factory 객체)을 만드는 패턴이라 이해하면 됩니다.
2.2. Robot
로봇 클래스는 다음처럼 작성했습니다. 각각 차례대로 Robot, SuperRobot, PowerRobot입니다. 여기서 설명드릴건 딱히 없습니다. 한가지 있다면 추후 클래스의 구별을 위해 개별적으로 이름(name)을 반환하는 메소드가 작성되어 있습니다.
package pattern.factory;public abstract class Robot { public abstract String getName();}
package pattern.factory;public class SuperRobot extends Robot { @Override public String getName() { return "SuperRobot"; }}
package pattern.factory;public class PowerRobot extends Robot { @Override public String getName() { return "PowerRobot"; }}
팩토리 메소드 패턴의 꽃은 역시 팩토리 클래스입니다. 차례대로 봅시다. 첫번째 보이는 코드는 기본 팩토리 클래스입니다.
package pattern.factory;public abstract class RobotFactory { abstract Robot createRobot(String name);}
아래 클래스는 기본 팩토리 클래스를 상속 받아 실제 로직을 구현한 팩토리입니다.
package pattern.factory;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 인자로 받아서 직접 인스턴스를 만들어 냅니다.
package pattern.factory;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; } }}
준비가 다 되었다면 메인 프로그램을 작성해서 돌려봅시다.
package pattern.factory;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
클래스간의 결합도를 낮추기 위한것입니다
결합도라는 것은 간단히 말해 클래스의 변경점이 생겼을 때 얼마나 다른 클래스에도 영향을 주는가입니다