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