4차산업혁명의 일꾼/Java&Spring웹개발과 서버 컴퓨터

디자인패턴 2 - 하위클래스에 위임하기 : 템플릿 패턴 , 팩토리 패턴

르무엘 2023. 2. 19. 23:14

박은종의 객체지향 설계를 위한 디자인패턴 with 자바

디자인패턴 2 - 하위클래스에 위임하기 : 템플릿 패턴 , 팩토리 패턴

 

1. 템플릿 메소드 패턴 - 구체적인 처리를 하위 클래스에 위임

객체의 레벨(템플릿) 변화에 따른 플레이어 상태(템플릿) 변화

객체의 레벨 상태에 따라 플레이서 상태(템플릿)변화를 하위클래스에 위임

 

  • 템플릿 메소드는 코드 재사용을 위한 기본 기술
  • 프레임워크에서 가장 많이 사용되는 패턴 중 하나
  • 클래스의 공통부분을 분리하는 기능 제공
  • 템플릿 메서드에서 사용하는 오퍼레이션들AbstractClass 에 정의된 오퍼레이션 중 구체적인 알고리즘을 가지고 있는 오퍼레이션훅 오퍼레이션
  • 기본 오퍼레이션으로 추상화된 오퍼레이션
  • ConcreteClass 오퍼레이션이나 클라이언트 클래스에 정의된 오퍼레이션

 

 

public abstract class PlayerLevel {

	public abstract void run();
	public abstract void jump();
	public abstract void turn();
	public abstract void showLevelMessage();
	
	final public void go(int count)
	{
		run();
		for(int i=0; i<count; i++){
			jump();
		}
		turn();
	}
}
public class BeginnerLevel extends PlayerLevel{

	@Override
	public void run() {
		System.out.println("천천히 달립니다.");
		
	}

	@Override
	public void jump() {
		System.out.println("Jump 할 줄 모르지롱.");
	}

	@Override
	public void turn() {
		System.out.println("Turn 할 줄 모르지롱.");		
	}

	@Override
	public void showLevelMessage() {
		System.out.println("***** 초보자 레벨 입니다. *****");
	}

}
public class AdvancedLevel extends PlayerLevel{
	@Override
	public void run() {
		System.out.println("빨리 달립니다.");
		
	}

	@Override
	public void jump() {
		System.out.println("높이 jump 합니다.");
	}

	@Override
	public void turn() {
		System.out.println("Turn 할 줄 모르지롱.");		
	}

	@Override
	public void showLevelMessage() {
		System.out.println("***** 중급자 레벨 입니다. *****");
	}
}
public class SuperLevel extends PlayerLevel{
	@Override
	public void run() {
		System.out.println("엄청 빨리 달립니다.");
		
	}

	@Override
	public void jump() {
		System.out.println("아주 높이 jump 합니다.");
	}

	@Override
	public void turn() {
		System.out.println("한 바퀴 돕니다.");		
	}

	@Override
	public void showLevelMessage() {
		System.out.println("***** 고급자 레벨 입니다. *****");
	}

}
public class Player {
	
	private PlayerLevel level;
	
	public Player()
	{
		level= new BeginnerLevel();
		level.showLevelMessage();
	}

	public PlayerLevel getLevel() {
		return level;
	}

	public void upgradeLevel(PlayerLevel level) {
		this.level = level;
		level.showLevelMessage();
	}
	
	public void play(int count){
		level.go(count);
	}
}
public class MainBoard {

	public static void main(String[] args) {

		Player player = new Player();
		player.play(1);
		AdvancedLevel aLevel = new AdvancedLevel();
		player.upgradeLevel(aLevel);
		player.play(2);
		SuperLevel sLevel = new SuperLevel();
		player.upgradeLevel(sLevel);
		player.play(3);
		
	}
}

2. 팩토리 메소드 패턴 - 인스턴스의 생성을 하위 클래스에 위

 

  • 객체를 생성하기 위한 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스에서 결정하게 함.
  • 여러 상황에 따라 각각 생성될 수 있는 객체에 대한 생성을 하위 클래스에 위임
  • 생성과 관련된 동일한 메서드는 상위 클래스에서 처리

 

상황에 따라 다양한 인스턴스 생성을 할 수 있음

객체의 공장에서(자동차 공장) 객체(자동차)를 생산

생산하면서 하위클래스에 객체의 종류(소나타,산타페)를 위임하여 선택가능

public abstract class Car {
	
	String carType;
	
	public String toString() {
		return carType;
	}

}
public abstract class CarFactory {

	
	public abstract Car createCar(String name);  // add - on

	public abstract Car returnMyCar(String name);
}
public class HyundaiFactory extends CarFactory{

	HashMap<String, Car> carMap = new HashMap<String, Car>();
	
	@Override
	public Car createCar(String name) {

		Car car = null;
		
		if (name == "sonata") {
			car = new Sonata();
		}
		else if( name == "santafe") {
			car =  new Santafe();
		}
		
		return car;
	}
	
	@Override
	public Car returnMyCar(String name) {
		
	// Jame는 Sonata, Tomas는 Santafe 인 경우
		
		Car myCar = carMap.get(name);
		if(myCar == null) {
			
			if(name.equals("James")){
				myCar = new Sonata();
			}
			else if(name.equals("Tomas") ){
				myCar = new Santafe();
			}
			carMap.put(name, myCar);
		}
		
		return myCar;
		
	}

}
public class Sonata extends Car{

	
	Sonata(){
		carType = "Sonata";
	}

}
public class Santafe extends Car{

	Santafe(){
		carType = "Santafe";
	}
}
public class CarTest {

	public static void main(String[] args) {

		CarFactory factory = new HyundaiFactory();
		Car newCar = factory.createCar("sonata");
		
		System.out.println(newCar);
		
		
		Car myCar = factory.returnMyCar("Tomas");
		Car hisCar = factory.returnMyCar("Tomas");
		System.out.println(myCar == hisCar);
				
	}

}
LIST