2018-5-1 Java DesignPattern - FactoryMethod Pattern
팩터리 메서드패턴
객체를 만들어내는 부분을 서브클래스에 위임한 패턴이다.
- 팩터리메서드는 객체를 생성 반환하는 메서드를 말한다. 패턴이 붙으면 하위클래스에서 팩터리 메서드를 오버라이딩해서 객체를 반환하게 한다.
package DesignPattern;
abstract class Animal2 {
// 추상 팩터리 메서드
abstract AnimalToy getToy();
}
abstract class AnimalToy {
abstract void identify();
}
class Dog2 extends Animal2 {
// 추상 팩터리 메서드 오버라이딩
@Override
AnimalToy getToy() {
return new DogToy();
}
}
class DogToy extends AnimalToy {
public void identify() {
System.out.println("나는 테니스공! 강아지의 친구");
}
}
class Cat2 extends Animal2 {
@Override
AnimalToy getToy() {
return new CatToy();
}
}
class CatToy extends AnimalToy {
@Override
public void identify() {
System.out.println("나는 캣타워! 고양이의 친구");
}
}
class Driver2 {
public static void main(String[] args) {
// 팩터리 메서드를 보유한 객체들 생성
Animal2 bolt = new Dog2();
Animal2 kitty = new Cat2();
// 팩터리메서드가 반환하는 객체들
AnimalToy boltBall = bolt.getToy();
AnimalToy kittyTower = kitty.getToy();
// 팩터리메서드가 반환한 객체들 사용
boltBall.identify();
kittyTower.identify();
}
}
//result
나는 테니스공! 강아지의 친구
나는 캣타워! 고양이의 친구
로봇을 이용한 팩토리메서드 설명
Robot(abstract class)
┗ SuperRobot
┗ PowerRobot
RobotFactory(abstract class)
┗ SuperRobotFactory
┗ ModifiedSuperRobotFactory
package pattern.factory;
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";
}
}
public abstract class RobotFactory {
abstract Robot createRobot(String name);
}
public class SuperRobotFactory extends RobotFactory {
@Override
Robot createRobot(String name) {
switch( name ){
case "super": return new SuperRobot();
case "power": return new PowerRobot();
}
return null;
}
}
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;
}
}
}
오버라이드된 메서드가 객체를 반환하는 패턴
Written on May 1, 2018